Merged in MBP-139-merge-integration-into-master (pull request #32)

MBP-139 merge integration into master
This commit is contained in:
Aaron James Long
2020-03-04 15:52:50 +00:00
committed by Federico Rojas
25 changed files with 2312 additions and 1617 deletions
Regular → Executable
+15 -5
View File
@@ -1,8 +1,18 @@
# end of line conversion CLRF -- LF
# Default is no conversion (follow Visual Studio)
* -text
#
.gitattributes text
.gitignore text
# Default is auto
* text=auto
# Hidden .git files: CRLF for convenience
.gitattributes text eol=crlf
.gitignore text eol=crlf
# Shell scripts must be LF
*.sh text eol=lf
# Tc files must be CRLF
*.plcproj text eol=crlf
*.Tc* text eol=crlf
*.tsproj text eol=crlf
*.txt text eol=crlf
*.xml text eol=crlf
*.xti text eol=crlf
+16 -12
View File
@@ -1,17 +1,21 @@
*.bak
*.pyc
*.suo
*.tmc
*.tpy
*.~u
*~
.#*
.epics.*
UpgradeLog.htm
\#*#
_Boot/
_CompileInfo/
_Libraries/
logs.0*
solution/TrialLicense.tclrs
tools/linux/ADS/
tools/linux/getADSState/getADSState.bin
logs.0*
.epics.*
*.bak
*.~u
*.pyc
*.tpy
*.suo
*~
.#*
\#*#
*.tmc
_Config/NC/Axes
_Config/IO
-3
View File
@@ -1,6 +1,3 @@
[submodule "solution/tc_epicscommodule"]
path = solution/tc_epicscommodule
url = https://bitbucket.org/europeanspallationsource/tc_epicscommodule.git
[submodule "solution/tc_project_app/tc_mca_std_lib"]
path = solution/tc_project_app/tc_mca_std_lib
url = https://bitbucket.org/europeanspallationsource/tc_mca_std_lib.git
BIN
View File
Binary file not shown.
+10
View File
@@ -0,0 +1,10 @@
image: python:3.7.3
options:
max-time: 1
pipelines:
default:
- step:
script:
- git submodule update --init
- python twincat_version_manager.py
- python check_fix_white_space.py
+113
View File
@@ -0,0 +1,113 @@
#!/usr/bin/env python3
#
# Script to fix whithespace errors in files
# All trailing white space are removed
# TAB are replace by spaces
#
import glob
import sys
file_patterns_tab_width = {"**/*.Tc*": 4,
"**/*.py": 4,
"**/*.sh": 8}
def fix_white_space(debug, fix_files):
"""
Checks the Twincat source code for white space:
TAB should not be used
Trailing SPACE shoulf not be there.
:return: A dictionary of white-space-damaged files
"""
incorrect_files = dict()
for file_path, tab_width in file_patterns_tab_width.items():
found_files = glob.glob(file_path, recursive=True)
#if not found_files:
# raise IOError("ERROR: No files of type {} found".format(file_path))
for pathname in found_files:
dirty = False
had_TAB = False
had_trailing_WS = False
new_lines = []
if debug >= 1:
print("tab_with=%d pathname=%s" % (tab_width, pathname))
file = open(pathname, 'r', newline='', encoding="iso-8859-1")
lines = file.readlines()
file.close()
for old_line in lines:
had_crlf = 0
this_line_dirty = False
if old_line.endswith('\r\n'):
had_crlf = 2 # Both CR and LF
elif old_line.endswith('\n'):
had_crlf = 1 # LF
# Convert all TAB into SPACE
new_line = old_line.expandtabs(tabsize=tab_width)
if new_line != old_line:
had_TAB = True
# Strip the CRLF
new_line = new_line.rstrip("\r\n")
# Strip trailing WS
tmp_line = new_line.rstrip(" ")
if tmp_line != new_line:
had_trailing_WS = True
new_line = tmp_line
if had_crlf == 2:
new_line = new_line + '\r\n'
elif had_crlf == 1:
new_line = new_line + '\n'
if len(new_line) != len(old_line):
dirty = True
this_line_dirty = True
new_lines.append(new_line)
if this_line_dirty:
if debug >= 2:
print("had_crlf=%d" % had_crlf)
print("old_line=%s" % old_line)
print("new_line=%s" % new_line)
# end of loop of all line in one file
if debug >= 1:
print("pathname=%s dirty=%d" % (pathname, dirty))
if dirty:
if had_TAB and had_trailing_WS:
incorrect_files[pathname] = 'has white space damage'
elif had_TAB:
incorrect_files[pathname] = 'has TAB'
elif had_trailing_WS:
incorrect_files[pathname] = 'has trailing whitespace'
if fix_files:
file = open(pathname, 'w', newline='', encoding="iso-8859-1")
file.writelines(new_lines)
file.close()
return incorrect_files
if __name__ == "__main__":
try:
argc = len(sys.argv)
arg_idx = 1
debug = 0
fix_files = False
while arg_idx < argc:
if sys.argv[arg_idx] == "--fix":
fix_files = True
elif sys.argv[arg_idx] == "--debug":
debug = debug + 1
else:
print("%s : [--fix|--debug]" % sys.argv[0])
exit(2)
arg_idx = arg_idx + 1
incorrect_files = fix_white_space(debug, fix_files)
if not fix_files:
for file in incorrect_files:
message = incorrect_files[file]
print("ERROR: '{}' {}".format(file,message))
if incorrect_files:
print('run %s --fix' % sys.argv[0])
exit(1)
except IOError as e:
print(e) # Likely no files found
exit(2)
+72 -72
View File
@@ -1,72 +1,72 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "solution", "solution\solution.tsproj", "{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|TwinCAT CE7 (ARMV7) = Debug|TwinCAT CE7 (ARMV7)
Debug|TwinCAT OS (ARMT2) = Debug|TwinCAT OS (ARMT2)
Debug|TwinCAT RT (x64) = Debug|TwinCAT RT (x64)
Debug|TwinCAT RT (x86) = Debug|TwinCAT RT (x86)
Release|TwinCAT CE7 (ARMV7) = Release|TwinCAT CE7 (ARMV7)
Release|TwinCAT OS (ARMT2) = Release|TwinCAT OS (ARMT2)
Release|TwinCAT RT (x64) = Release|TwinCAT RT (x64)
Release|TwinCAT RT (x86) = Release|TwinCAT RT (x86)
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.21005.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{B1E792BE-AA5F-4E3C-8C82-674BF9C0715B}") = "solution", "solution\solution.tsproj", "{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|TwinCAT CE7 (ARMV7) = Debug|TwinCAT CE7 (ARMV7)
Debug|TwinCAT OS (ARMT2) = Debug|TwinCAT OS (ARMT2)
Debug|TwinCAT RT (x64) = Debug|TwinCAT RT (x64)
Debug|TwinCAT RT (x86) = Debug|TwinCAT RT (x86)
Release|TwinCAT CE7 (ARMV7) = Release|TwinCAT CE7 (ARMV7)
Release|TwinCAT OS (ARMT2) = Release|TwinCAT OS (ARMT2)
Release|TwinCAT RT (x64) = Release|TwinCAT RT (x64)
Release|TwinCAT RT (x86) = Release|TwinCAT RT (x86)
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{9CF97348-B9D3-4938-B1F2-5F0B0B6AA66A}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{F935F1DE-0753-4702-B418-1DC0ED040A4D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT CE7 (ARMV7).ActiveCfg = Debug|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT CE7 (ARMV7).Build.0 = Debug|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT OS (ARMT2).ActiveCfg = Debug|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT OS (ARMT2).Build.0 = Debug|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x64).ActiveCfg = Debug|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT CE7 (ARMV7).ActiveCfg = Release|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT CE7 (ARMV7).Build.0 = Release|TwinCAT CE7 (ARMV7)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT OS (ARMT2).ActiveCfg = Release|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT OS (ARMT2).Build.0 = Release|TwinCAT OS (ARMT2)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x64).ActiveCfg = Release|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{FB261665-FD20-4BF2-97F8-2854C82B752D}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
+4 -4
View File
@@ -1,5 +1,5 @@
Copy and paste in this folder the licenses contained inside the Beckhoff CPU in the path:
C:\TwinCAT\3.1\Target\License
Copy and paste in this folder the licenses contained inside the Beckhoff CPU in the path:
C:\TwinCAT\3.1\Target\License
Thank you
-2
View File
@@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcLicenseInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2011/11/TcLicenseInfo"><LicenseInfo><SystemId>{647C6958-3A0C-73AB-3631-FCA93A32D91D}</SystemId><IssueTime>2019-03-28T10:01:00</IssueTime><ExpireTime>2019-04-05T00:00:00</ExpireTime><LicenseKey>c5d3cb1031fe69b92637f818532268e150e73209fbcde806d6a45fa5c587430d79f2c1228179d00673ab0c897cec2974facbbdea6732800f514190342df993e6cf6c8900d81c6168e82abc6419353caaa16eae89c3652b99dc5724bd894c9688d636d924d65f9bd2be9c76a54d9389d9c2e80b95ac96243e653e4af19badfbdfa010ba61245f038ad5eef223906c4cade2def8629cdbed3a49da1c64a666625c6c23b0d87507ee78907eaf7e2d8bf7b2ce4fd5d511ecc80ae9058fbc8fabd02bf239827c8abad467f34390374768fe2427b583c8af5c86ee51c2f4bbadd341b0daccb1e0c5625b4894babedd35d3cb816a514aab66bc4fcaa5762164e6e078da</LicenseKey><License><LicenseId>{4C256767-E6E6-4AF5-BD68-9F7ABAD0C200}</LicenseId><Name>TC3 ADS</Name><OrderNo>TC1000</OrderNo></License><License><LicenseId>{3FF18E97-7754-401B-93FB-70544DE28A13}</LicenseId><Name>TC3 IO</Name><OrderNo>TC1100</OrderNo></License><License><LicenseId>{66689887-CCBD-452C-AC9A-039D997C6E66}</LicenseId><Name>TC3 PLC</Name><OrderNo>TC1200</OrderNo></License><License><LicenseId>{A19036CF-A53B-4E3A-99FF-023EF5C4798B}</LicenseId><Name>TC3 NC PTP Axis</Name><Instances>10</Instances></License><License><LicenseId>{520DE751-9DB6-47CB-8240-BD5C466E7E64}</LicenseId><Name>TC3 NC PTP</Name><OrderNo>TF5000</OrderNo></License><License><LicenseId>{3EBB9639-5FF3-42B6-8847-35C70DC013C8}</LicenseId><Name>TC3 TCP/IP</Name><OrderNo>TF6310</OrderNo></License></LicenseInfo></TcLicenseInfo>
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<TcSmItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4023.119" ClassName="CNcSafTaskDef" SubType="0">
<NC>
<SafTask Priority="4" CycleTime="20000" AmsPort="501" IoAtBegin="true">
<Name>NC-Task 1 SAF</Name>
<Vars VarGrpType="1" InsertType="1">
<Name>Inputs</Name>
</Vars>
<Vars VarGrpType="2" InsertType="1">
<Name>Outputs</Name>
</Vars>
<Image Id="1" AddrType="1" ImageType="1">
<Name>Image</Name>
</Image>
</SafTask>
<SvbTask Priority="8" CycleTime="100000" AmsPort="511">
<Name>NC-Task 1 SVB</Name>
</SvbTask>
</NC>
</TcSmItem>
+40 -1032
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<GVL Name="GVL_APP" Id="{8fe9690c-7907-432e-bedb-6fc99b5ce255}">
<Declaration><![CDATA[{attribute 'qualified_only'}
VAR_GLOBAL
END_VAR
VAR_GLOBAL CONSTANT
axisNum : UINT:=0;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>
@@ -0,0 +1,279 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<GlobalTextList Name="GlobalTextList" Id="{c3494959-baa5-4f73-b0cd-9c11912145dd}">
<XmlArchive>
<Data>
<o xml:space="preserve" t="GlobalTextListObject">
<l n="TextList" t="ArrayList" cet="TextListRow">
<o>
<v n="TextID">"951"</v>
<v n="TextDefault">"%2.2f"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"878"</v>
<v n="TextDefault">"%d"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"706"</v>
<v n="TextDefault">"%i"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"940"</v>
<v n="TextDefault">"%x"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"703"</v>
<v n="TextDefault">"Acknowledge"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"710"</v>
<v n="TextDefault">"Active:"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"952"</v>
<v n="TextDefault">"actPos"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"953"</v>
<v n="TextDefault">"actVel"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"110"</v>
<v n="TextDefault">"AXESMAX"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"107"</v>
<v n="TextDefault">"axisSel"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"945"</v>
<v n="TextDefault">"bBusy"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"950"</v>
<v n="TextDefault">"bBwEnabled"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"946"</v>
<v n="TextDefault">"bDone"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"943"</v>
<v n="TextDefault">"bEnabled"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"941"</v>
<v n="TextDefault">"bError"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"102"</v>
<v n="TextDefault">"bExecute"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"949"</v>
<v n="TextDefault">"bFwEnabled"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"297"</v>
<v n="TextDefault">"bGeared"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"948"</v>
<v n="TextDefault">"bHomed"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"947"</v>
<v n="TextDefault">"bResetDone"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"944"</v>
<v n="TextDefault">"bWarning"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"704"</v>
<v n="TextDefault">"Clear All"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"104"</v>
<v n="TextDefault">"ENABLE"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"106"</v>
<v n="TextDefault">"ENABLE BW"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"105"</v>
<v n="TextDefault">"ENABLE FW"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"109"</v>
<v n="TextDefault">"English"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"939"</v>
<v n="TextDefault">"errID"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"701"</v>
<v n="TextDefault">"Error #"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"705"</v>
<v n="TextDefault">"Error #:"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"702"</v>
<v n="TextDefault">"Error Log"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"707"</v>
<v n="TextDefault">"Errors:"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"955"</v>
<v n="TextDefault">"fAcceleration"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"956"</v>
<v n="TextDefault">"fDeceleration"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"957"</v>
<v n="TextDefault">"fPosition"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"708"</v>
<v n="TextDefault">"Free Entries:"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"954"</v>
<v n="TextDefault">"fVelocity"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"299"</v>
<v n="TextDefault">"gearIn"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"300"</v>
<v n="TextDefault">"gearOut"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"711"</v>
<v n="TextDefault">"Inactive:"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"116"</v>
<v n="TextDefault">"jogBw"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"117"</v>
<v n="TextDefault">"jogFw"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"298"</v>
<v n="TextDefault">"masterGear"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"111"</v>
<v n="TextDefault">"moveAbsolute"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"114"</v>
<v n="TextDefault">"moveModulo"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"113"</v>
<v n="TextDefault">"moveRelative"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"112"</v>
<v n="TextDefault">"moveVelocity"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"709"</v>
<v n="TextDefault">"Overflows:"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"942"</v>
<v n="TextDefault">"reset"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"115"</v>
<v n="TextDefault">"stop"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"108"</v>
<v n="TextDefault">"Test Language"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
<o>
<v n="TextID">"103"</v>
<v n="TextDefault">"toggle"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
</l>
<l n="Languages" t="ArrayList" />
<v n="GuidInit">{062c6d5a-aca0-4f82-8481-8e26e8c8681e}</v>
<v n="GuidReInit">{d08328f1-0dac-4dfb-b105-bd18d7b5a756}</v>
<v n="GuidExitX">{180f93fa-c96b-483e-953c-133bc7d30e18}</v>
</o>
</Data>
<TypeList>
<Type n="ArrayList">System.Collections.ArrayList</Type>
<Type n="GlobalTextListObject">{63784cbb-9ba0-45e6-9d69-babf3f040511}</Type>
<Type n="Guid">System.Guid</Type>
<Type n="String">System.String</Type>
<Type n="TextListRow">{53da1be7-ad25-47c3-b0e8-e26286dad2e0}</Type>
</TypeList>
</XmlArchive>
</GlobalTextList>
</TcPlcObject>
+328 -124
View File
@@ -1,125 +1,329 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4022.10">
<POU Name="MAIN" Id="{33eb6f49-7781-4211-a70b-87ada6d80cb7}" SpecialFunc="None">
<Declaration><![CDATA[PROGRAM MAIN
VAR
sVersion: STRING:='1.0.0';
i : UINT; //index variable for AXES()
aFbAxes: ARRAY [1..gvl.axisNum] OF FB_Axis;
(******Outputs: Power for Limit switches and Home Sensors (every 4th output)********)
bOutput1 AT %Q*: BOOL:= TRUE;
//bOutput2 AT %Q*: BOOL:= TRUE;
//bOutput3 AT %Q*: BOOL:= TRUE;
//bOutput4 AT %Q*: BOOL:= TRUE;
//bOutput5 AT %Q*: BOOL:= TRUE;
//bOutput6 AT %Q*: BOOL:= TRUE;
//bOutput7 AT %Q*: BOOL:= TRUE;
//bOutput8 AT %Q*: BOOL:= TRUE;
//bOutput9 AT %Q*: BOOL:= TRUE;
//bOutput13 AT %Q*: BOOL:= TRUE;
//bOutput17 AT %Q*: BOOL:= TRUE;
//bOutput21 AT %Q*: BOOL:= TRUE;
//bOutput24 AT %Q*: BOOL:= TRUE;
//bOutput28 AT %Q*: BOOL:= TRUE;
(******Error Handling********)
fbErrorList: FB_ErrorList;
//fbEL3214: EL3214;
//fbEL1808: EL1808;
//fbEL2819: EL2819;
//fbEL9410: EL9410;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[PROG();
AXES();
ERROR();]]></ST>
</Implementation>
<Action Name="AXES" Id="{7eb32732-9b53-4934-8cd9-20ba971dd8ff}">
<Implementation>
<ST><![CDATA[
FOR i:=1 TO gvl.axisNum DO
aFBAxes[i](stAxisStruct:=gvl.axes[i]);
END_FOR
]]></ST>
</Implementation>
</Action>
<Action Name="ERROR" Id="{35f2cf38-f81e-4aa3-9534-be5fb417817d}">
<Implementation>
<ST><![CDATA[//
(****FB containting the log of the errors****)
//
fbErrorList(
En:= TRUE,
bReset:= ,
lErrorID:= ,
bACK:= ,
EnO=> ,
nNoError=> ,
nNoOverflow=> ,
pErrorSystem=> );
(*call all the necessary instance (input assistance F2 or right click) according to the terminals that you have in your hardware and
add "TRUE" in the input En, the corresponding number of termianl to the iTerminal_ID and
the variable "fbErrorList.pErrorSystem" to the input ErrorSystem in each FB E. g. :
fbEL1808(
En:= TRUE,
iTerminal_ID:= 1,
ErrorSystem:= fbErrorList.pErrorSystem,
EnO=> ,
bDi_1=> ,
bDi_2=> ,
bDi_3=> ,
bDi_4=> ,
bDi_5=> ,
bDi_6=> ,
bDi_7=> ,
bDi_8=> ,
bError=> ); *)
//
]]></ST>
</Implementation>
</Action>
<Action Name="PROG" Id="{5d03ebbb-2a47-4890-ad6d-e82daf72dc51}">
<Implementation>
<ST><![CDATA[//
(* Program any sequence, safety or feature (if necessary) application specific in thsi section*)
//]]></ST>
</Implementation>
</Action>
<LineIds Name="MAIN">
<LineId Id="2" Count="0" />
<LineId Id="81" Count="1" />
</LineIds>
<LineIds Name="MAIN.AXES">
<LineId Id="3" Count="0" />
<LineId Id="1" Count="0" />
<LineId Id="4" Count="0" />
<LineId Id="10" Count="0" />
<LineId Id="7" Count="0" />
<LineId Id="16" Count="0" />
<LineId Id="11" Count="0" />
</LineIds>
<LineIds Name="MAIN.ERROR">
<LineId Id="31" Count="0" />
<LineId Id="10" Count="1" />
<LineId Id="2" Count="7" />
<LineId Id="1" Count="0" />
<LineId Id="12" Count="1" />
<LineId Id="29" Count="1" />
<LineId Id="16" Count="12" />
<LineId Id="14" Count="0" />
<LineId Id="32" Count="1" />
</LineIds>
<LineIds Name="MAIN.PROG">
<LineId Id="2" Count="0" />
<LineId Id="1" Count="0" />
<LineId Id="3" Count="0" />
</LineIds>
</POU>
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<POU Name="MAIN" Id="{33eb6f49-7781-4211-a70b-87ada6d80cb7}" SpecialFunc="None">
<Declaration><![CDATA[PROGRAM MAIN
VAR
sVersion: STRING:='1.0.0';
i : UINT; //index variable for AXES()
aFbAxes: ARRAY [1..gvl_app.axisNum] OF FB_Axis;
hmiAxisSelection : INT:=1; //Not possible to use local hmi variables for array indexes
(******Outputs: Power for Limit switches and Home Sensors (every 4th output)********)
bOutput1 AT %Q*: BOOL:= TRUE;
//bOutput2 AT %Q*: BOOL:= TRUE;
//bOutput3 AT %Q*: BOOL:= TRUE;
//bOutput4 AT %Q*: BOOL:= TRUE;
//bOutput5 AT %Q*: BOOL:= TRUE;
//bOutput6 AT %Q*: BOOL:= TRUE;
//bOutput7 AT %Q*: BOOL:= TRUE;
//bOutput8 AT %Q*: BOOL:= TRUE;
//bOutput9 AT %Q*: BOOL:= TRUE;
//bOutput13 AT %Q*: BOOL:= TRUE;
//bOutput17 AT %Q*: BOOL:= TRUE;
//bOutput21 AT %Q*: BOOL:= TRUE;
//bOutput24 AT %Q*: BOOL:= TRUE;
//bOutput28 AT %Q*: BOOL:= TRUE;
(******Startup, Shutdown and UPS********)
fbUPS : FB_S_UPS_CX51x0;
eUpsMode : E_S_UPS_Mode := eSUPS_WrPersistData_Shutdown;
eStartUp: (ColdStart, ReadAxisFeedbackType, CheckReadDone, ExecuteRestore, CheckRestore, FinishRestore);
bPositionRestoreDone : BOOL := FALSE;
bRestoreExecute : BOOL := FALSE;
bExecuteReadEncRefSys : BOOL := FALSE;
iRetry : INT;
fbReadEncRefSys : ARRAY [1..gvl_app.axisNum] OF MC_ReadParameter;
fbRestorePosition : ARRAY [1..GVL_app.axisNum] OF MC_SetPosition;
fbGetDeviceIdentification : FB_GetDeviceIdentification;
END_VAR
VAR PERSISTENT
bRestoreOnStartup : BOOL;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[POSITION_RECOVERY();
PROG();
AXES();]]></ST>
</Implementation>
<Folder Name="POSITION_RECOVERY" Id="{3561f6ef-e145-4ed3-9839-f17334bd2d97}" />
<Action Name="AXES" Id="{7eb32732-9b53-4934-8cd9-20ba971dd8ff}">
<Implementation>
<ST><![CDATA[FOR GVL.iAxis:=1 TO gvl_app.axisNum DO
aFbAxes[GVL.iAxis](stAxisStruct:=gvl.axes[GVL.iAxis]);
END_FOR]]></ST>
</Implementation>
</Action>
<Action Name="CHECK_UPS" Id="{f0f28f50-53b8-4f73-b0f5-6d7ce4c1636f}" FolderPath="POSITION_RECOVERY\">
<Implementation>
<ST><![CDATA[fbUPS(eUpsMode := eUpsMode); (* call UPS-FB instance in first lines of the fastest PLC Task *)
IF eGlobalSUpsState = eSUPS_PowerFailure THEN
(* first cycle of powerfailure *)
(* execute code that should only be done once with each powerfailure, i.e. increase powerfailure counter *)
bRestoreOnStartup:=TRUE;
STORE_PERSISTENT();
RETURN;
ELSIF eGlobalSUpsState <> eSUPS_PowerOK THEN
(* next cycles of powerfailure *)
(* skip regular code execution for the remaining cycles of the powerfailure/writing of persistent data/quick shutdown ... *)
RETURN;
END_IF]]></ST>
</Implementation>
</Action>
<Action Name="POSITION_RECOVERY" Id="{28e203b7-aea5-42d0-980d-12a6841f9d22}" FolderPath="POSITION_RECOVERY\">
<Implementation>
<ST><![CDATA[fbGetDeviceIdentification(bExecute:=TRUE);
IF (fbGetDeviceIdentification.stDevIdent.strHardwareSerialNo <> '0') THEN
CHECK_UPS();
RESTORE_POSITIONS();
END_IF]]></ST>
</Implementation>
</Action>
<Action Name="PROG" Id="{5d03ebbb-2a47-4890-ad6d-e82daf72dc51}">
<Implementation>
<ST><![CDATA[//
(* Program any sequence, safety or feature (if necessary) application specific in thsi section*)
//]]></ST>
</Implementation>
</Action>
<Action Name="RESTORE_POSITIONS" Id="{0c7ee537-7bd9-4833-b428-c17cbb57e893}" FolderPath="POSITION_RECOVERY\">
<Implementation>
<ST><![CDATA[///#########################################################
// This ACT will restore the position of an incremental axis on startup with the act position it read before losing power.
// It checks the type of axis, 0=incremental, and that the axis was stationary at shut down.
// Because 0 equates to incremental we also need to check that the data is valid, otherwise by default it would restore all axes.
// By default an axis will not restore the position unless it is set to opt-in, i.e. gvl.axes[i].config.eRestorePosition is non-zero.
// This needs to be initialised somewhere in TwinCAT code otherwise it will not be available at start up.
// A restore will only be performed on a loss of power, this code shouldn't make any changes on a reset cold, a rest origin or a download.
// There is a enum to allow for different types of restore modes, currently only one is implemented.
// 0 'DontRestore'
// 1 'RestoreWithoutHome' -restores the position using a set position fb and does not set the home bit in the axis struct.
// Note from Beckhoff: "A maximum of 1 MB persistent data can be reliably saved over the entire service life."
///#########################################################
IF bRestoreOnStartup AND eGlobalSUpsState = eSUPS_PowerOK THEN
bRestoreOnStartup:=FALSE;
bRestoreExecute:=TRUE;
END_IF
// Upon startup bPositionRestoreDone will be set to FALSE, after successfully completing the following code it will be set TRUE
// and should stay TRUE for the rest of the time the PLC is operational, thus this routine should only be completed once.
IF bRestoreExecute AND NOT bPositionRestoreDone THEN
// Cycle through function blocks that read the encoder reference system i.e. whether axis is incremental or absolute
// Result stored in Value, 0=Inc 1=Abs, execute set during the case statement
FOR i:=1 TO gvl_app.axisNum DO
fbReadEncRefSys[i](
Axis:= gvl.axes[i].Axis,
Enable:= bExecuteReadEncRefSys,
ParameterNumber:= MC_AxisParameter.AxisEncoderReferenceSystem,
Value=>,
ReadMode:= E_READMODE.READMODE_ONCE);
END_FOR
// Cycle through set position function blocks for each axis
FOR i:=1 TO gvl_app.axisNum DO
fbRestorePosition[i](
Axis:= gvl.axes[i].Axis,
Execute:= ,
Position:= axesPersistent[i].iPositionAtShutdown);
END_FOR
CASE eStartUp OF
ColdStart:
// First cycle of the PLC, do nothing just give one cycle for variables to initialise
IF NOT bPositionRestoreDone THEN
eStartUp:= ReadAxisFeedbackType;
iRetry:=0;
END_IF
ReadAxisFeedbackType:
// Exectute the function blocks to read the encoder reference system (0=inc OR 1=ABS)
bExecuteReadEncRefSys:=TRUE;
eStartUp:=CheckReadDone;
CheckReadDone:
// Check the encoder reference system has been read for all axis -> if busy then continue with PLC cycle and check again next time.
// If fbReadEncRefSys not started then go back a step.
// If any axes result in an error the code will get stuck here, this happens if gvl_app.axisNum is not set correctly
FOR i:=1 TO gvl_app.axisNum DO
IF fbReadEncRefSys[i].Valid = FALSE THEN
IF fbReadEncRefSys[i].Busy = TRUE THEN
// Exit MAIN.STARTUP Action and wait till next cycle, needs to cycle through whole program in order for data to update
RETURN;
ELSE
// Sometimes the code gets here and the fbReadEncRefSys[i] misses the rising edge. If the code gets here it means
// .valid=FALSE and .busy=FALSE which indicateds the FB probably hasn't started and thus needs to see a rising edge.
// Set execute to low, Exit MAIN.STARTUP and go back a step in the CASE statement.
bExecuteReadEncRefSys:=FALSE;
eStartUp:=ReadAxisFeedbackType;
iRetry:=iRetry+1; // counter used for troubleshooting to see how many cycles it takes before fbReadEncRefSys function blocks are read correctly
RETURN;
END_IF
END_IF
END_FOR
// If the code gets here all axes either have .valid=TRUE for all axes
eStartUp:= ExecuteRestore;
ExecuteRestore:
// Execute position restore by setting fbRestorePosition.execute = TRUE
FOR i:=1 TO gvl_app.axisNum DO
IF fbReadEncRefSys[i].Valid = TRUE AND fbReadEncRefSys[i].Value = 0 AND NOT(axesPersistent[i].bMovingAtShutdown) THEN
IF GVL.axes[i].config.eRestorePosition = RestorePosition.RestoreWithoutHome THEN
fbRestorePosition[i].Execute:=TRUE;
END_IF
END_IF
END_FOR
eStartUp:= CheckRestore;
CheckRestore:
// Check the set position fbs are finished
// Nothing actually happens if the restore is not done, the code just returns from here each cycle and the
// bPositionRestoreDone will never get set to TRUE and will take up cycle time
FOR i:=1 TO gvl_app.axisNum DO
IF fbReadEncRefSys[i].Valid = TRUE AND fbReadEncRefSys[i].Value = 0 AND NOT(axesPersistent[i].bMovingAtShutdown) THEN
IF GVL.axes[i].config.eRestorePosition = RestorePosition.RestoreWithoutHome THEN
IF NOT fbRestorePosition[i].Done THEN
RETURN;
END_IF
END_IF
END_IF
END_FOR
eStartUp:= FinishRestore;
FinishRestore:
// Remove execute = TRUE for fbRestorePosition
FOR i:=1 TO gvl_app.axisNum DO
fbRestorePosition[i].Execute:=FALSE;
END_FOR
bPositionRestoreDone:=TRUE;
bRestoreExecute:=FALSE;
END_CASE
END_IF]]></ST>
</Implementation>
</Action>
<Action Name="STORE_PERSISTENT" Id="{cb5c9254-2e5f-47b1-9baa-10e728a961b0}" FolderPath="POSITION_RECOVERY\">
<Implementation>
<ST><![CDATA[FOR i:=1 TO gvl_app.axisNum DO
axesPersistent[i].iPositionAtShutdown:=gvl.axes[i].Axis.NcToPlc.ActPos;
IF gvl.axes[i].Axis.NcToPlc.ActVelo <> 0 THEN
axesPersistent[i].bMovingAtShutdown:=TRUE;
ELSE
axesPersistent[i].bMovingAtShutdown:=FALSE;
END_IF
axesPersistent[i].bMovingAtShutdown:=axesPersistent[i].bMovingAtShutdown OR gvl.axes[i].Axis.Status.Moving;
END_FOR]]></ST>
</Implementation>
</Action>
<LineIds Name="MAIN">
<LineId Id="505" Count="0" />
<LineId Id="134" Count="0" />
<LineId Id="81" Count="0" />
</LineIds>
<LineIds Name="MAIN.AXES">
<LineId Id="1" Count="0" />
<LineId Id="4" Count="0" />
<LineId Id="10" Count="0" />
</LineIds>
<LineIds Name="MAIN.CHECK_UPS">
<LineId Id="2" Count="11" />
<LineId Id="1" Count="0" />
</LineIds>
<LineIds Name="MAIN.POSITION_RECOVERY">
<LineId Id="2" Count="3" />
<LineId Id="1" Count="0" />
</LineIds>
<LineIds Name="MAIN.PROG">
<LineId Id="2" Count="0" />
<LineId Id="1" Count="0" />
<LineId Id="3" Count="0" />
</LineIds>
<LineIds Name="MAIN.RESTORE_POSITIONS">
<LineId Id="99" Count="0" />
<LineId Id="94" Count="0" />
<LineId Id="98" Count="0" />
<LineId Id="213" Count="0" />
<LineId Id="101" Count="0" />
<LineId Id="233" Count="1" />
<LineId Id="102" Count="0" />
<LineId Id="215" Count="0" />
<LineId Id="214" Count="0" />
<LineId Id="109" Count="0" />
<LineId Id="95" Count="0" />
<LineId Id="236" Count="2" />
<LineId Id="240" Count="0" />
<LineId Id="239" Count="0" />
<LineId Id="206" Count="0" />
<LineId Id="208" Count="1" />
<LineId Id="207" Count="0" />
<LineId Id="100" Count="0" />
<LineId Id="91" Count="1" />
<LineId Id="2" Count="7" />
<LineId Id="96" Count="0" />
<LineId Id="10" Count="6" />
<LineId Id="18" Count="2" />
<LineId Id="177" Count="0" />
<LineId Id="21" Count="3" />
<LineId Id="171" Count="0" />
<LineId Id="25" Count="0" />
<LineId Id="178" Count="0" />
<LineId Id="26" Count="1" />
<LineId Id="170" Count="0" />
<LineId Id="29" Count="0" />
<LineId Id="179" Count="0" />
<LineId Id="163" Count="0" />
<LineId Id="212" Count="0" />
<LineId Id="152" Count="0" />
<LineId Id="139" Count="0" />
<LineId Id="131" Count="0" />
<LineId Id="155" Count="0" />
<LineId Id="190" Count="0" />
<LineId Id="140" Count="0" />
<LineId Id="157" Count="0" />
<LineId Id="210" Count="1" />
<LineId Id="187" Count="0" />
<LineId Id="150" Count="1" />
<LineId Id="200" Count="0" />
<LineId Id="145" Count="0" />
<LineId Id="141" Count="0" />
<LineId Id="166" Count="0" />
<LineId Id="203" Count="0" />
<LineId Id="201" Count="0" />
<LineId Id="173" Count="0" />
<LineId Id="56" Count="0" />
<LineId Id="181" Count="0" />
<LineId Id="57" Count="1" />
<LineId Id="216" Count="0" />
<LineId Id="219" Count="1" />
<LineId Id="63" Count="2" />
<LineId Id="174" Count="0" />
<LineId Id="66" Count="0" />
<LineId Id="182" Count="0" />
<LineId Id="204" Count="1" />
<LineId Id="67" Count="1" />
<LineId Id="221" Count="0" />
<LineId Id="71" Count="2" />
<LineId Id="222" Count="0" />
<LineId Id="79" Count="2" />
<LineId Id="175" Count="0" />
<LineId Id="82" Count="0" />
<LineId Id="223" Count="0" />
<LineId Id="83" Count="3" />
<LineId Id="241" Count="0" />
<LineId Id="87" Count="0" />
<LineId Id="1" Count="0" />
</LineIds>
<LineIds Name="MAIN.STORE_PERSISTENT">
<LineId Id="10" Count="0" />
<LineId Id="3" Count="0" />
<LineId Id="5" Count="1" />
<LineId Id="8" Count="1" />
<LineId Id="7" Count="0" />
<LineId Id="4" Count="0" />
<LineId Id="1" Count="0" />
</LineIds>
</POU>
</TcPlcObject>
+15 -15
View File
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4022.6">
<Task Name="PlcTask" Id="{96ece0eb-a21b-4000-8986-812071c196ce}">
<!--CycleTime in micro seconds.-->
<CycleTime>1000</CycleTime>
<Priority>20</Priority>
<PouCall>
<Name>MAIN</Name>
</PouCall>
<TaskFBGuid>{26d89752-95b4-4b52-80c0-c79242bc34d7}</TaskFBGuid>
<Fb_init>{137c4fd1-c794-4dee-a041-b4fea1d22866}</Fb_init>
<Fb_exit>{2478772d-357b-433f-886f-15340bef9bdf}</Fb_exit>
<CycleUpdate>{c16ee410-277f-45f0-a92e-1ec5f87024b9}</CycleUpdate>
<PostCycleUpdate>{291eb57a-f9a9-4722-b7d3-fd700e5db288}</PostCycleUpdate>
</Task>
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<Task Name="PlcTask" Id="{96ece0eb-a21b-4000-8986-812071c196ce}">
<!--CycleTime in micro seconds.-->
<CycleTime>10000</CycleTime>
<Priority>20</Priority>
<PouCall>
<Name>MAIN</Name>
</PouCall>
<TaskFBGuid>{26d89752-95b4-4b52-80c0-c79242bc34d7}</TaskFBGuid>
<Fb_init>{137c4fd1-c794-4dee-a041-b4fea1d22866}</Fb_init>
<Fb_exit>{2478772d-357b-433f-886f-15340bef9bdf}</Fb_exit>
<CycleUpdate>{c16ee410-277f-45f0-a92e-1ec5f87024b9}</CycleUpdate>
<PostCycleUpdate>{291eb57a-f9a9-4722-b7d3-fd700e5db288}</PostCycleUpdate>
</Task>
</TcPlcObject>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<POU Name="tcUNIT_APP_RUN" Id="{677fcae4-9d84-425e-8fcd-8e3d3a1985e8}" SpecialFunc="None">
<Declaration><![CDATA[(* tcUNIT Tests: Add this program to PLC task in order to run tcUNIT tests against the declared POU test suites.
see https://tcunit.org/ for documentation.*)
PROGRAM tcUNIT_APP_RUN
VAR
(* Declare standard library POU tests to be run
E.g. fbMoveNonLinearSlits: FB_MoveNonLinearSlits_Test;*)
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TcUnit.RUN();]]></ST>
</Implementation>
<LineIds Name="tcUNIT_APP_RUN">
<LineId Id="45" Count="0" />
</LineIds>
</POU>
</TcPlcObject>
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<POU Name="FB_tcUNIT_common" Id="{0f757d3d-99b7-46eb-bdc6-03aa126689f4}" SpecialFunc="None">
<Declaration><![CDATA[// tcUNIT Common function block: Contains helper methods for tcUNIT.
FUNCTION_BLOCK FB_tcUNIT_common
VAR
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
<Method Name="mEnableAxis" Id="{12e91532-7139-4c17-998e-4c670b584b9d}">
<Declaration><![CDATA[METHOD mEnableAxis : BOOL
VAR_INPUT
iAxisIndex: INT; // The idex of the axis to action the method on.
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[GVL.axes[iAxisIndex].control.bEnable := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="mExecute" Id="{010bd927-5568-40db-a7c5-fcfe995a5cb1}">
<Declaration><![CDATA[METHOD mExecute : BOOL
VAR_INPUT
iAxisIndex: INT; // The idex of the axis to action the method on.
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[GVL.axes[iAxisIndex].control.bExecute := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="mPrepareDefaultMove" Id="{c23244d5-896c-49ad-8d8a-19390856e4dc}">
<Declaration><![CDATA[METHOD mPrepareDefaultMove
VAR_INPUT
iAxisIndex: INT; // The idex of the axis to action the method on.
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[// Prepare an axis so it is ready to action a move using target defaults when executed.
GVL.axes[iAxisIndex].control.bEnable := TRUE;
GVL.axes[iAxisIndex].control.eCommand := MotionFunctions.MoveAbsolute;
GVL.axes[iAxisIndex].inputs.bLimitBwd := TRUE;
GVL.axes[iAxisIndex].inputs.bLimitFwd := TRUE;
GVL.axes[iAxisIndex].config.fVelocity := tcUNIT_GVL.fDEFAULT_TARGET_VELOCITY;
GVL.axes[iAxisIndex].config.fAcceleration := tcUNIT_GVL.fDEFAULT_TARGET_ACCELERATION;
GVL.axes[iAxisIndex].config.fDeceleration := tcUNIT_GVL.fDEFAULT_TARGET_DECCELERATION;
GVL.axes[iAxisIndex].config.fOverride := tcUNIT_GVL.fDEFAULT_TARGET_OVERRIDE;
GVL.axes[iAxisIndex].config.fPosition := tcUNIT_GVL.fDEFAULT_POSITION;]]></ST>
</Implementation>
</Method>
<Method Name="mPrepareMove" Id="{97bd5417-d0a1-4d32-8732-16310a863fcc}">
<Declaration><![CDATA[METHOD mPrepareMove
VAR_INPUT
iAxisIndex: INT; // The idex of the axis to action the method on.
fTargetVelocity: LREAL;
fTargetAcceleration: LREAL;
fTargetDeceleration: LREAL;
fTargetPosition: LREAL;
eMotionStrategy: MotionFunctions; // The desired MotionFunctions motion strategy.
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[// Prepare the axis so it is ready to action a move when executed for a given motion strategy.
GVL.axes[iAxisIndex].control.bEnable := FALSE;
GVL.axes[iAxisIndex].control.eCommand := eMotionStrategy;
GVL.axes[iAxisIndex].inputs.bLimitBwd := TRUE;
GVL.axes[iAxisIndex].inputs.bLimitFwd := TRUE;
GVL.axes[iAxisIndex].config.fVelocity := fTargetVelocity;
GVL.axes[iAxisIndex].config.fAcceleration := fTargetAcceleration;
GVL.axes[iAxisIndex].config.fDeceleration := fTargetDeceleration;
GVL.axes[iAxisIndex].config.fPosition := fTargetPosition;]]></ST>
</Implementation>
</Method>
<Method Name="mSetAxisDefaults" Id="{5b9336be-4414-4858-a614-0fdb2847e171}">
<Declaration><![CDATA[METHOD mSetAxisDefaults
VAR_INPUT
iAxisIndex: INT; // The idex of the axis to action the method on.
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[// Set PLC default values for the axis. Note: Status values can take multiple cycles to updated. This is not an instant reset.
IF GVL.axes[iAxisIndex].status.bBusy THEN
GVL.axes[iAxisIndex].control.bStop := TRUE;
END_IF
IF GVL.axes[iAxisIndex].status.bError THEN
GVL.axes[iAxisIndex].control.bReset := TRUE;
END_IF
IF NOT GVL.axes[iAxisIndex].control.bEnable AND GVL.axes[iAxisIndex].control.bStop THEN
GVL.axes[iAxisIndex].control.bStop := FALSE;
END_IF
GVL.axes[iAxisIndex].control.bEnable := FALSE;
GVL.axes[iAxisIndex].control.bExecute := FALSE;
GVL.axes[iAxisIndex].control.bReset := FALSE;
GVL.axes[iAxisIndex].control.bJogFwd := FALSE;
GVL.axes[iAxisIndex].control.bJogBwd := FALSE;
GVL.axes[iAxisIndex].control.bStop := FALSE;
GVL.axes[iAxisIndex].control.eCommand := MotionFunctions.MoveAbsolute;
GVL.axes[iAxisIndex].config.fVelocity := 0.0;
GVL.axes[iAxisIndex].config.fAcceleration := 0.0;
GVL.axes[iAxisIndex].config.fDeceleration := 0.0;
GVL.axes[iAxisIndex].config.fPosition := 0;
GVL.axes[iAxisIndex].config.fOverride := 0.0;
GVL.axes[iAxisIndex].config.nHomeSeq := 0;
GVL.axes[iAxisIndex].inputs.bLimitBwd := FALSE;
GVL.axes[iAxisIndex].inputs.bLimitFwd := FALSE;
GVL.axes[iAxisIndex].inputs.bEncLAtch := FALSE;
GVL.axes[iAxisIndex].inputs.bHomeSensor := FALSE;]]></ST>
</Implementation>
</Method>
<LineIds Name="FB_tcUNIT_common">
<LineId Id="9" Count="0" />
</LineIds>
<LineIds Name="FB_tcUNIT_common.mEnableAxis">
<LineId Id="5" Count="0" />
</LineIds>
<LineIds Name="FB_tcUNIT_common.mExecute">
<LineId Id="5" Count="0" />
</LineIds>
<LineIds Name="FB_tcUNIT_common.mPrepareDefaultMove">
<LineId Id="6" Count="0" />
<LineId Id="38" Count="0" />
<LineId Id="8" Count="1" />
<LineId Id="39" Count="0" />
<LineId Id="11" Count="6" />
<LineId Id="19" Count="0" />
</LineIds>
<LineIds Name="FB_tcUNIT_common.mPrepareMove">
<LineId Id="17" Count="11" />
</LineIds>
<LineIds Name="FB_tcUNIT_common.mSetAxisDefaults">
<LineId Id="6" Count="0" />
<LineId Id="41" Count="0" />
<LineId Id="34" Count="1" />
<LineId Id="31" Count="0" />
<LineId Id="44" Count="1" />
<LineId Id="43" Count="0" />
<LineId Id="36" Count="2" />
<LineId Id="7" Count="19" />
</LineIds>
</POU>
</TcPlcObject>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<GVL Name="tcUNIT_GVL" Id="{4b23d6c9-6a88-40b7-9bf4-d55c4dfd4246}">
<Declaration><![CDATA[// tcUNIT_GVL: Global variables used in tcUNIT tests.
{attribute 'qualified_only'}
VAR_GLOBAL CONSTANT
// Constants for axis defaults.
fDEFAULT_VELOCITY: LREAL := 0.0;
fDEFAULT_ACCELERATION: LREAL := 0.0;
fDEFAULT_DECCELERATION: LREAL := 0.0;
fDEFAULT_POSITION: LREAL := 0.0;
fDEFAULT_TARGET_VELOCITY: LREAL := 1.0;
fDEFAULT_TARGET_ACCELERATION: LREAL := 0.5;
fDEFAULT_TARGET_DECCELERATION: LREAL := 0.5;
fDEFAULT_TARGET_POSITION: LREAL := 10.0;
fDEFAULT_TARGET_OVERRIDE: LREAL := 100;
END_VAR
VAR_GLOBAL
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>
@@ -0,0 +1,248 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<POU Name="FB_Axis_TEST" Id="{3bfca2b4-3b3f-48f2-9900-9d4cd3404e9e}" SpecialFunc="None">
<Declaration><![CDATA[// Test suite for the FB_Axis POU
{attribute 'call_after_init'}
FUNCTION_BLOCK FB_Axis_TEST EXTENDS tcUnit.FB_TestSuite
VAR
fbCommon: FB_tcUNIT_common;
iTargetAxis: INT := 1; // The <index> of the axis within GVL.axes[<index>] to test against.
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[// Declare methods defined in the FB_Axis_TEST POU to be included (executed) in the test suite
SetAxisControl_Enabled();
CheckAxisStatus_Moving();
SetAxisConfig_Acceleration();
CheckAxisStatus_NewPosition();
SetAxisControl_Velocity();
SetAxisInputs_bLimitFwd();]]></ST>
</Implementation>
<Method Name="CheckAxisStatus_Moving" Id="{f7dcf822-91ec-4555-918f-e2487353578a}">
<Declaration><![CDATA[METHOD CheckAxisStatus_Moving
VAR
Result: BOOL;
ExpectedResult: BOOL;
nCycle: UINT;
nMaxCycles: UINT := 30;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TEST('test_GIVEN_new_axis_position_WHEN_execute_move_THEN_axis_moves');
ExpectedResult := TRUE;
fbCommon.mPrepareDefaultMove(iTargetAxis);
fbCommon.mExecute(iTargetAxis);
Result := GVL.axes[iTargetAxis].status.bBusy;
IF nCycle > nMaxCycles OR ExpectedResult = Result THEN
AssertEquals(Expected := ExpectedResult,
Actual := Result,
Message := 'Axis is not moving.');
TEST_FINISHED();
ELSE
nCycle := nCycle + 1;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="CheckAxisStatus_NewPosition" Id="{604b9446-af57-41db-afac-f53f5b12cc2c}">
<Declaration><![CDATA[METHOD CheckAxisStatus_NewPosition
VAR
InitialValue: LREAL;
Result: LREAL;
ExpectedResult: LREAL;
nCycle: UINT;
nCycleMax: UINT := 100;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TEST('test_GIVEN_new_axis_position_set_WHEN_executed_THEN_axis_moves_to_new_position');
// Since the axis has state; a test might begin the position at some location set by
// a previous test. Therefore if we execute a move we should just check it's moved
// from the initial location not some initial default.
InitialValue := GVL.axes[iTargetAxis].config.fPosition;
ExpectedResult := InitialValue + 10;
GVL.axes[iTargetAxis].config.fPosition := ExpectedResult;
GVL.axes[iTargetAxis].control.eCommand := MotionFunctions.MoveAbsolute;
GVL.axes[iTargetAxis].control.bExecute := TRUE;
Result := GVL.axes[iTargetAxis].status.fActPosition;
IF nCycle > nCycleMax OR ExpectedResult = Result THEN
AssertEquals(Expected := ExpectedResult,
Actual := Result,
Message := 'fPosition of the axis is different.');
TEST_FINISHED();
ELSE
nCycle := nCycle + 1;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="SetAxisConfig_Acceleration" Id="{2efd2402-6ad3-455d-a703-347847c98522}">
<Declaration><![CDATA[METHOD SetAxisConfig_Acceleration
VAR
InitialValue: LREAL;
Result: LREAL;
ExpectedResult: LREAL;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TEST('test_GIVEN_new_axis_acceleration_set_WHEN_executed_THEN_new_axis_acceleration_set');
// example of direct GVL axis reference for assert.
ExpectedResult := tcUNIT_gvl.fDEFAULT_TARGET_ACCELERATION;
fbCommon.mPrepareDefaultMove(iTargetAxis);
Result := GVL.axes[1].config.fAcceleration;
AssertEquals(Expected := ExpectedResult,
Actual := Result,
Message := 'fAcceleration of the axis is different.');
TEST_FINISHED();]]></ST>
</Implementation>
</Method>
<Method Name="SetAxisControl_Enabled" Id="{749049e6-6152-4a23-ac76-75883bd089b7}">
<Declaration><![CDATA[METHOD SetAxisControl_Enabled
VAR
Result: BOOL;
ExpectedResult: BOOL;
nCycle: UINT;
nMaxCycles: UINT := 30;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TEST('test_GIVEN_prepare_default_move_WHEN_move_prepared_THEN_axis_enabled');
// example of test that requires multiple cycles to complete. Due to stateful behaviour of the axis structure.
ExpectedResult := TRUE;
GVL.axes[1].control.bEnable := ExpectedResult;
Result := GVL.axes[iTargetAxis].status.bEnabled;
IF nCycle > nMaxCycles OR ExpectedResult = Result THEN
AssertEquals(Expected := ExpectedResult,
Actual := Result,
Message := 'Axis is not enabled.');
TEST_FINISHED();
ELSE
nCycle := nCycle + 1;
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="SetAxisControl_Velocity" Id="{f87270b6-fb94-4214-bb13-17f22f6ab8f5}">
<Declaration><![CDATA[METHOD SetAxisControl_Velocity
VAR
InitialValue: LREAL;
Result: LREAL;
ExpectedResult: LREAL;
fDelta: REAL := 0.01;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TEST('test_GIVEN_new_axis_velocity_set_WHEN_executed_THEN_new_axis_velocity_set');
// Example of using a tcUNIT assert for a specific type (in this case LREAL).
InitialValue := GVL.axes[iTargetAxis].config.fVelocity;
ExpectedResult := InitialValue + 0.5;
GVL.Axes[iTargetAxis].config.fVelocity := ExpectedResult;
Result := GVL.axes[iTargetAxis].config.fVelocity;
AssertEquals_LREAL(Expected := ExpectedResult,
Actual := Result,
Delta := fDelta,
Message := 'fVelocity of the axis is different.');
TEST_FINISHED();
]]></ST>
</Implementation>
</Method>
<Method Name="SetAxisInputs_bLimitFwd" Id="{6304c3b1-9e72-403e-9ae2-a5609b1efe92}">
<Declaration><![CDATA[METHOD SetAxisInputs_bLimitFwd
VAR
Result: BOOL;
ExpectedResult: BOOL;
nCycle: UINT;
nMaxCycles: UINT := 30;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TEST('test_GIVEN_prepare_default_move_WHEN_bFwEnabled_prepared_enabled_THEN_bFwEnable_enabled');
ExpectedResult := TRUE;
GVL.axes[iTargetAxis].inputs.bLimitFwd := TRUE;
Result := GVL.axes[iTargetAxis].status.bFwEnabled;
IF nCycle > nMaxCycles OR ExpectedResult = Result THEN
AssertEquals(Expected := ExpectedResult,
Actual := Result,
Message := 'Axis bLimitFwd is not enabled.');
TEST_FINISHED();
ELSE
nCycle := nCycle + 1;
END_IF]]></ST>
</Implementation>
</Method>
<LineIds Name="FB_Axis_TEST">
<LineId Id="37" Count="0" />
<LineId Id="34" Count="0" />
<LineId Id="38" Count="1" />
<LineId Id="12" Count="0" />
<LineId Id="40" Count="0" />
<LineId Id="48" Count="0" />
</LineIds>
<LineIds Name="FB_Axis_TEST.CheckAxisStatus_Moving">
<LineId Id="127" Count="16" />
</LineIds>
<LineIds Name="FB_Axis_TEST.CheckAxisStatus_NewPosition">
<LineId Id="121" Count="21" />
<LineId Id="56" Count="0" />
</LineIds>
<LineIds Name="FB_Axis_TEST.SetAxisConfig_Acceleration">
<LineId Id="5" Count="0" />
<LineId Id="50" Count="1" />
<LineId Id="9" Count="0" />
<LineId Id="13" Count="0" />
<LineId Id="57" Count="0" />
<LineId Id="23" Count="0" />
<LineId Id="22" Count="0" />
<LineId Id="25" Count="4" />
<LineId Id="24" Count="0" />
</LineIds>
<LineIds Name="FB_Axis_TEST.SetAxisControl_Enabled">
<LineId Id="144" Count="16" />
<LineId Id="107" Count="0" />
</LineIds>
<LineIds Name="FB_Axis_TEST.SetAxisControl_Velocity">
<LineId Id="5" Count="0" />
<LineId Id="92" Count="1" />
<LineId Id="10" Count="0" />
<LineId Id="61" Count="2" />
<LineId Id="67" Count="0" />
<LineId Id="69" Count="0" />
<LineId Id="91" Count="0" />
<LineId Id="70" Count="1" />
<LineId Id="80" Count="0" />
<LineId Id="72" Count="0" />
<LineId Id="24" Count="0" />
<LineId Id="86" Count="0" />
</LineIds>
<LineIds Name="FB_Axis_TEST.SetAxisInputs_bLimitFwd">
<LineId Id="24" Count="0" />
<LineId Id="26" Count="0" />
<LineId Id="25" Count="0" />
<LineId Id="48" Count="2" />
<LineId Id="67" Count="0" />
<LineId Id="19" Count="0" />
<LineId Id="58" Count="6" />
<LineId Id="57" Count="0" />
</LineIds>
</POU>
</TcPlcObject>
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<POU Name="tcUNIT_STD_LIB_RUN" Id="{5e8cc903-e536-40be-a096-d6b305fbb618}" SpecialFunc="None">
<Declaration><![CDATA[// tcUNIT Standard Library tests: Add program to PLC task in order to run tcUNIT tests against the declared POU test suites
PROGRAM tcUNIT_STD_LIB_RUN
VAR
// Declare standard library POU tests to be run
fbFB_Axis: FB_Axis_TEST;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[TcUnit.RUN();]]></ST>
</Implementation>
<LineIds Name="tcUNIT_STD_LIB_RUN">
<LineId Id="45" Count="0" />
</LineIds>
</POU>
</TcPlcObject>
@@ -0,0 +1,568 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.0">
<VisuManager Name="Visualization Manager" Id="{9ab27b0a-e061-4269-b032-b221661a7379}">
<XmlArchive>
<Data>
<o xml:space="preserve" t="VisualManagerObject">
<v n="UseUnicodeStrings" t="UnicodeSupport">Undefined</v>
<o n="ViewSettings" t="VisualManagerViewSettings">
<n n="StartVisu" />
<v n="StartVisu33">"MainVisu"</v>
<v n="OpenTargetvisu">false</v>
<v n="BestFit">false</v>
<v n="ClientSizeMode" t="VisualClientSizeMode">AutoDetect</v>
<v n="ClientSizeX">2000</v>
<v n="ClientSizeY">2000</v>
<v n="ExtendedSettings">false</v>
<v n="PaintBufferSize">50000</v>
<v n="MemorybufferSize">400000</v>
<v n="VisuInternal">false</v>
<v n="CurrentVisuGlobal">false</v>
<v n="FileTransferMode">true</v>
<v n="VisuStyle">"Default, 3.1.5.0 (Beckhoff Automation GmbH)"</v>
<v n="MaxNumOfClients">100</v>
<v n="Language">""</v>
<v n="NumpadDialog">"VisuDialogs.Numpad"</v>
<v n="KeypadDialog">"VisuDialogs.Keypad"</v>
<v n="InputWithLimitsDialog">"VisuDialogs.TextinputWithLimits"</v>
<v n="UseInputWithLimits">false</v>
<v n="TouchHandlingActive">false</v>
<v n="SemiTransparentDrawingActive">true</v>
<v n="UpdateColorvariablesAfterActivationDone">true</v>
<v n="TransferSvgAndConvertedImages">false</v>
<v n="LoginDialog">"VisuUserManagement.VUM_Login"</v>
<v n="ChangePasswordDialog">"VisuUserManagement.VUM_ChangePassword"</v>
<v n="ChangeConfigDialog">"VisuUserManagement.VUM_UserManagement"</v>
<v n="GuidShowChangePasswordDialogFunction">{00000000-0000-0000-0000-000000000000}</v>
<v n="GuidShowChangeConfigDialogFunction">{00000000-0000-0000-0000-000000000000}</v>
<v n="UseStandardKeyboardHandling">true</v>
<v n="PaintDeactiveElementsGrayedOut">true</v>
<v n="ConvertImages">false</v>
<v n="ConversionType">""</v>
</o>
<o n="RegisterDesc" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>FB_Init</v>
<v>c98701bd-1e9f-450a-a2a8-a2474d536f2e</v>
<v>FB_Reinit</v>
<v>5b6e372a-a69d-40e8-aef7-f470b7c53d95</v>
<v>FB_Exit</v>
<v>0be1b9ab-e8eb-4b33-b803-109abb46bde4</v>
</d>
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{aa8b7e42-e967-427f-8f2e-f00f9d706470}</v>
</o>
<o n="TargetProperties" t="VisualizationTargetProperties">
<o n="AvailableKeys" t="DeviceBasedHotkeysProvider">
<v n="Modifiers">7</v>
<v n="DevType">4096</v>
<v n="DevId">"1002 0004"</v>
<v n="DevVersion">"1.0.0.4"</v>
<v n="BaseProvider">{cb73a13e-6ccc-4bc6-8859-f5aa98bb116b}</v>
<l n="Keys" t="ArrayList" cet="DeviceBasedHotkeyItem">
<o>
<v n="FromBase">true</v>
<v n="KeyCode">48</v>
<v n="CanonicalName">"0"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">49</v>
<v n="CanonicalName">"1"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">50</v>
<v n="CanonicalName">"2"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">51</v>
<v n="CanonicalName">"3"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">52</v>
<v n="CanonicalName">"4"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">53</v>
<v n="CanonicalName">"5"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">54</v>
<v n="CanonicalName">"6"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">55</v>
<v n="CanonicalName">"7"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">56</v>
<v n="CanonicalName">"8"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">57</v>
<v n="CanonicalName">"9"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">65</v>
<v n="CanonicalName">"A"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">107</v>
<v n="CanonicalName">"ADDITION"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">66</v>
<v n="CanonicalName">"B"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">8</v>
<v n="CanonicalName">"BACKSPACE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">67</v>
<v n="CanonicalName">"C"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">110</v>
<v n="CanonicalName">"COMMA"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">68</v>
<v n="CanonicalName">"D"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">46</v>
<v n="CanonicalName">"DELETE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">111</v>
<v n="CanonicalName">"DIVIDE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">40</v>
<v n="CanonicalName">"DOWN"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">69</v>
<v n="CanonicalName">"E"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">35</v>
<v n="CanonicalName">"END"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">27</v>
<v n="CanonicalName">"ESCAPE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">70</v>
<v n="CanonicalName">"F"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">112</v>
<v n="CanonicalName">"F1"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">121</v>
<v n="CanonicalName">"F10"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">122</v>
<v n="CanonicalName">"F11"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">123</v>
<v n="CanonicalName">"F12"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">113</v>
<v n="CanonicalName">"F2"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">114</v>
<v n="CanonicalName">"F3"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">115</v>
<v n="CanonicalName">"F4"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">116</v>
<v n="CanonicalName">"F5"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">117</v>
<v n="CanonicalName">"F6"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">118</v>
<v n="CanonicalName">"F7"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">119</v>
<v n="CanonicalName">"F8"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">120</v>
<v n="CanonicalName">"F9"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">71</v>
<v n="CanonicalName">"G"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">72</v>
<v n="CanonicalName">"H"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">36</v>
<v n="CanonicalName">"HOME"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">73</v>
<v n="CanonicalName">"I"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">45</v>
<v n="CanonicalName">"INSERT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">74</v>
<v n="CanonicalName">"J"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">75</v>
<v n="CanonicalName">"K"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">76</v>
<v n="CanonicalName">"L"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">37</v>
<v n="CanonicalName">"LEFT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">77</v>
<v n="CanonicalName">"M"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">106</v>
<v n="CanonicalName">"MULTIPLY"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">78</v>
<v n="CanonicalName">"N"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">96</v>
<v n="CanonicalName">"NUM0"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">97</v>
<v n="CanonicalName">"NUM1"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">98</v>
<v n="CanonicalName">"NUM2"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">99</v>
<v n="CanonicalName">"NUM3"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">100</v>
<v n="CanonicalName">"NUM4"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">101</v>
<v n="CanonicalName">"NUM5"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">102</v>
<v n="CanonicalName">"NUM6"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">103</v>
<v n="CanonicalName">"NUM7"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">104</v>
<v n="CanonicalName">"NUM8"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">105</v>
<v n="CanonicalName">"NUM9"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">79</v>
<v n="CanonicalName">"O"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">80</v>
<v n="CanonicalName">"P"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">19</v>
<v n="CanonicalName">"PAUSE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">42</v>
<v n="CanonicalName">"PRINT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">81</v>
<v n="CanonicalName">"Q"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">82</v>
<v n="CanonicalName">"R"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">13</v>
<v n="CanonicalName">"RETURN_KEY"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">39</v>
<v n="CanonicalName">"RIGHT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">83</v>
<v n="CanonicalName">"S"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">32</v>
<v n="CanonicalName">"SPACE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">109</v>
<v n="CanonicalName">"SUBTRACT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">84</v>
<v n="CanonicalName">"T"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">9</v>
<v n="CanonicalName">"TAB"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">85</v>
<v n="CanonicalName">"U"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">38</v>
<v n="CanonicalName">"UP"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">86</v>
<v n="CanonicalName">"V"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">87</v>
<v n="CanonicalName">"W"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">88</v>
<v n="CanonicalName">"X"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">89</v>
<v n="CanonicalName">"Y"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">90</v>
<v n="CanonicalName">"Z"</v>
</o>
</l>
</o>
</o>
<o n="ConfiguredHotkeys" t="HotkeyConfiguration">
<v n="IdMin">481037385728L</v>
<v n="IdMax">549755813887L</v>
<v n="Id">481037385728L</v>
<v n="IdMask">549754765312L</v>
<v n="IdStep">1048576L</v>
<l2 n="Inputs" />
</o>
<o n="DefInpHandlerGuids" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>ExecuteLooseCapture</v>
<v>4e2884cd-dc97-4120-914c-87a83e618f1f</v>
<v>ExecuteMouseUp</v>
<v>57eea9a5-15d9-4269-bb8d-9fee5420cdb2</v>
<v>Init</v>
<v>e61a0910-39b6-4bcc-9a64-fcab62230628</v>
<v>FB_Exit</v>
<v>e6e1ea47-0811-4b03-9888-d0564361e0d6</v>
<v>ExecuteMouseDblClick</v>
<v>a517a0ac-170b-4df4-b289-55dcb57628ed</v>
<v>GetElementInfo</v>
<v>f64cb89f-3016-4fba-85f5-02efcd4282c1</v>
<v>ExecuteMouseDown</v>
<v>94bab392-b395-4c03-9d0e-5738d11bd021</v>
<v>FB_Reinit</v>
<v>97933c03-0169-4afe-ac83-de892204e120</v>
<v>Initialize</v>
<v>6946d6e0-129f-4425-b8b0-ef98281a99e9</v>
<v>ExecuteMouseMove</v>
<v>58fc221c-be14-4e34-871e-a118f8ba9539</v>
<v>ExecuteDialogClosed</v>
<v>f08d08b6-e70c-4bef-a136-38845bd246d8</v>
<v>ExecuteKeyUp</v>
<v>7403635b-2725-4f00-93d4-e0dd125959de</v>
<v>ExecuteKeyDown</v>
<v>9649ecda-3794-4d6b-a8a7-71e528d9d170</v>
<v>abstrGetDefaultCursor</v>
<v>25718998-50a9-408d-8b3f-20a55e2cc784</v>
<v>ExecuteMouseEnter</v>
<v>569205fa-533b-4fc2-8d51-21ccab693305</v>
<v>ExecuteMouseLeave</v>
<v>3bacea68-55b4-4764-928e-e69910299932</v>
<v>FB_Init</v>
<v>f37e1250-9b48-45ca-810e-c192ea9440ec</v>
<v>ExecuteMouseClick</v>
<v>cd348bda-7eaf-4dfe-8c4b-bf9b71e5b10c</v>
</d>
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{073ee466-cf0a-4c8b-ba92-64f671516699}</v>
</o>
<n n="InstantiationStorage" />
<n n="VisuUserManagement" />
<v n="UseLocalUserMgmt">true</v>
<v n="UseUserMgmtInPlc">true</v>
<n n="RemoteUserMgmtPath" />
<n n="FontsConfig" />
<n n="FontDownloadConfig" />
<n n="VisuInitializationCode" />
<v n="GuidVisuSettingsPou">{925c2b24-84d1-469a-954d-7af8b99219ef}</v>
<v n="GuidVisuSettingsPouInit">{f905b871-af16-47c5-a6ef-0a0918a8b009}</v>
<v n="GuidVisuSettingsPouReInit">{d3706fa7-8257-48b3-af0a-cab0afb4dc49}</v>
<v n="GuidVisuSettingsPouBoolMethod">{4d5d9e0c-fa46-4312-abcd-ab81ecde84e1}</v>
<v n="GuidVisuSettingsPouDIntMethod">{00a84c7a-9a31-408b-860a-9d896efbd842}</v>
<v n="GuidVisuSettingsPouStringMethod">{3ef700b6-44e8-4cfc-b6e0-26bfef38c2b6}</v>
<v n="GuidVisuSettingsPouReservedMethod">{e2123cf7-55c2-43c4-8135-f70e23d789b6}</v>
<v n="GuidMemManInitPou">{b7fab3e5-7354-42a4-bdf2-bc53461ec63c}</v>
<v n="GuidMemManInitPouInit">{967863f2-ccef-44e4-a545-05cbd9acb6be}</v>
<v n="GuidMemManInitPouReInit">{f97c4870-0a84-4b7b-9cfd-0059a20bebbd}</v>
<v n="GuidStartVisuInitPou">{81498829-8b99-4474-8196-a48127c8e5d4}</v>
<v n="GuidStartVisuInitPouInit">{71bfd0df-7f34-4abc-b3b9-84bad2430630}</v>
<v n="GuidStartVisuInitPouReInit">{6695a96b-387d-4f98-b9f1-09dab5b7c483}</v>
<v n="GuidVisuGVL0">{5fe53f14-f5a7-4173-9e2b-538b7d89379a}</v>
<v n="GuidVisuGVL1">{09c26f6e-e9b1-4455-a763-8dfd243af668}</v>
<v n="GuidVisuGVL2">{48451f3d-75f9-48ba-acdb-82d62e000f26}</v>
<v n="GuidVisuGVL_3">{8214e061-c2ef-40f5-b519-acfed1ca1cca}</v>
<v n="GuidReservedPou">{97cdf6c7-053d-4364-abf2-f17c232375c1}</v>
<v n="GuidVisuGVL3">{30af51e2-0f28-4c98-bb4e-6c7a4ef6b64e}</v>
<v n="GuidReservedPouInit">{9e20996c-a8e0-4843-9524-9317ce5fc512}</v>
<v n="GuidVisuGVL4">{9d656f8b-b228-46a1-8204-ecc426d69d24}</v>
<v n="GuidVisuGVL5">{0a915a90-ba73-4abc-b7c3-f5acec9f952a}</v>
<v n="GuidLicenseGVL">{0dedbb39-c60c-476d-aa88-36e50d09fdfc}</v>
<v n="GuidGlobalClientManagerGVL">{9dd59c98-b565-4e32-8873-d0c41e452b61}</v>
<v n="GuidVisuUserMgmtInitPou">{43ba7f16-75cc-4157-b401-5b6df597b0b4}</v>
<v n="GuidVisuUserMgmtInitPouInit">{ccfc9bcc-edea-480a-ac07-0c05646a5eda}</v>
<v n="GuidBeforeCompileCommonGVL">{5531e874-67e5-49bb-abdc-7ac83b125a33}</v>
<v n="GuidVisuGVL6">{398fdf90-7db7-4f59-b7ca-c68fb5513e2e}</v>
<v n="GuidReservedPouMethod1">{c21922fc-3c9f-4927-affe-3857961c67c0}</v>
<v n="GuidReservedPouReInit">{b435091b-c53f-4ea3-9ed5-223f402a82e7}</v>
<v n="GuidReservedPouMethod0">{2acce1aa-45b9-434d-bd0d-05676ddde292}</v>
<v n="GuidReservedPouMethod2">{7e796d60-07e9-4daf-b8ad-e42e285dae85}</v>
</o>
</Data>
<TypeList>
<Type n="ArrayList">System.Collections.ArrayList</Type>
<Type n="Boolean">System.Boolean</Type>
<Type n="CaseInsensitiveHashtable">{7df88604-7ac5-4e36-91c4-55e4fdad3e68}</Type>
<Type n="DeviceBasedHotkeyItem">{11a86981-4b02-4f98-b432-96e385cb41b7}</Type>
<Type n="DeviceBasedHotkeysProvider">{c91fc5aa-1e38-43b2-9a05-c52cc5d7f5b6}</Type>
<Type n="GenericFbDescription">{40d6dd8d-dfd0-493a-8e29-c9a35e1e6539}</Type>
<Type n="Guid">System.Guid</Type>
<Type n="HotkeyConfiguration">{6b108d46-58af-4e41-a3f4-174d8f160cc4}</Type>
<Type n="Int32">System.Int32</Type>
<Type n="Int64">System.Int64</Type>
<Type n="String">System.String</Type>
<Type n="UnicodeSupport">{19611221-ebd3-4607-86d2-9822fbe84c30}</Type>
<Type n="VisualClientSizeMode">{c37fe731-4f69-4d98-82fe-4f9aefbe200d}</Type>
<Type n="VisualizationTargetProperties">{997fedbb-1888-4256-b61c-2933d8056bfd}</Type>
<Type n="VisualManagerObject">{4d3fdb8f-ab50-4c35-9d3a-d4bb9bb9a628}</Type>
<Type n="VisualManagerViewSettings">{ec9b2ec6-92a2-4856-be72-7866fb274c64}</Type>
</TypeList>
</XmlArchive>
</VisuManager>
</TcPlcObject>
+318 -346
View File
@@ -1,347 +1,319 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FileVersion>1.0.0.0</FileVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{fb261665-fd20-4bf2-97f8-2854c82b752d}</ProjectGuid>
<SubObjectsSortedByName>True</SubObjectsSortedByName>
<Name>tc_project_app</Name>
<ProgramVersion>3.1.4022.2</ProgramVersion>
<Application>{047dee04-c246-47b2-8ccc-a15e36987c43}</Application>
<TypeSystem>{ae4eb5ee-6030-47a6-bf35-5a6afd9efeeb}</TypeSystem>
<Implicit_Task_Info>{5ef19bd0-aca2-493f-b2a1-89e363647697}</Implicit_Task_Info>
<Implicit_KindOfTask>{f52f0efe-1be1-4600-94a9-9aa59fdf8e4e}</Implicit_KindOfTask>
<Implicit_Jitter_Distribution>{26d08e27-a705-49a9-95de-a3a0b6ea049c}</Implicit_Jitter_Distribution>
<LibraryReferences>{577f21c4-8eb2-4f2c-a24e-4c3f62ca96d2}</LibraryReferences>
<AutoUpdateVisuProfile>true</AutoUpdateVisuProfile>
</PropertyGroup>
<ItemGroup>
<Compile Include="PlcTask.TcTTO">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\MAIN.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\MotionFunctions.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisStruct.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\GVLs\GVL.TcGVL">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_ReadFloatParameter.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_ReadParameterInNc_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_WriteFloatParameter.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_WriteParameterInNc_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ErrorHandling\DUT_ErrorState.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ErrorHandling\DUT_TerminalError.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ErrorHandling\FB_ErrorList.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ErrorHandling\FB_TerminalError.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ErrorHandling\GVL_ErrorSystem.TcGVL">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ErrorHandling\ST_ErrorSystem.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Analog_Inputs\EL3174_0002.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Analog_Inputs\EL3214.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Analog_Inputs\EL3255.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Analog_Inputs\FB_CalculateFrequency_3702_v0_01.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs\EL1008.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs\EL1018.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs\EL1808.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs\EL1809.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs\EL1819.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs\FB_EL1252ASM_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\EL2014.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\EL2252.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\EL2808.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\EL2819.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\External_Types\dutEL2521_Ctrl.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\External_Types\dutEL2521_Status.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Measuring_Terminals\EL5002.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Measuring_Terminals\EL5021.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Measuring_Terminals\EL5042.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Measuring_Terminals\EL5101.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Motion\EL7211_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Motion\EL9576_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\System\EL9410.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\System\EL9505.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Hardware\Other\EK1200.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\FB_Axis.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeDirect.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeFinish.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomePrepare.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeReadNcVelocities.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeReadSoftLimEnable.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeToSwitch.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeVirtual.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeWriteNcVelocities.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeWriteSoftLimEnable.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_Homing.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\VISUs\FbDriveVisual.TcVIS">
<SubType>Code</SubType>
<DependentUpon>Visualization Manager.TcVMO</DependentUpon>
</Compile>
<Compile Include="tc_mca_std_lib\VISUs\Visualization.TcVIS">
<SubType>Code</SubType>
<DependentUpon>Visualization Manager.TcVMO</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="DUTs" />
<Folder Include="GVLs" />
<Folder Include="tc_mca_std_lib" />
<Folder Include="tc_mca_std_lib\DUTs" />
<Folder Include="tc_mca_std_lib\GVLs" />
<Folder Include="tc_mca_std_lib\POUs" />
<Folder Include="tc_mca_std_lib\POUs\ChangeConfig" />
<Folder Include="tc_mca_std_lib\POUs\Hardware" />
<Folder Include="tc_mca_std_lib\POUs\Hardware" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Analog_Inputs" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Inputs" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Digital_Outputs\External_Types" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Measuring_Terminals" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\Motion" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\EtherCAT_Terminals\System" />
<Folder Include="tc_mca_std_lib\POUs\Hardware\Other" />
<Folder Include="tc_mca_std_lib\POUs\Motion" />
<Folder Include="tc_mca_std_lib\POUs\Hardware" />
<Folder Include="tc_mca_std_lib\POUs\ErrorHandling" />
<Folder Include="tc_mca_std_lib\POUs\Motion\Homing" />
<Folder Include="tc_mca_std_lib\VISUs" />
<Folder Include="VISUs" />
<Folder Include="POUs" />
</ItemGroup>
<ItemGroup>
<PlaceholderReference Include="System_VisuElemMeter">
<DefaultResolution>VisuElemMeter, 3.5.10.0 (System)</DefaultResolution>
<Namespace>VisuElemMeter</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElems">
<DefaultResolution>VisuElems, 3.5.10.20 (System)</DefaultResolution>
<Namespace>VisuElems</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElemsSpecialControls">
<DefaultResolution>VisuElemsSpecialControls, 3.5.10.0 (System)</DefaultResolution>
<Namespace>VisuElemsSpecialControls</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElemsWinControls">
<DefaultResolution>VisuElemsWinControls, 3.5.10.20 (System)</DefaultResolution>
<Namespace>VisuElemsWinControls</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElemTextEditor">
<DefaultResolution>VisuElemTextEditor, 3.5.10.10 (System)</DefaultResolution>
<Namespace>VisuElemTextEditor</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="system_visuinputs">
<DefaultResolution>visuinputs, 3.5.10.0 (system)</DefaultResolution>
<Namespace>visuinputs</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuNativeControl">
<DefaultResolution>VisuNativeControl, 3.5.10.0 (System)</DefaultResolution>
<Namespace>VisuNativeControl</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_EtherCAT">
<DefaultResolution>Tc2_EtherCAT, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_EtherCAT</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_MC2">
<DefaultResolution>Tc2_MC2, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_MC2</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_Standard">
<DefaultResolution>Tc2_Standard, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Standard</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_System">
<DefaultResolution>Tc2_System, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_System</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_Utilities">
<DefaultResolution>Tc2_Utilities, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Utilities</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc3_MC2_AdvancedHoming">
<DefaultResolution>Tc3_MC2_AdvancedHoming, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_MC2_AdvancedHoming</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc3_Module">
<DefaultResolution>Tc3_Module, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_Module</Namespace>
</PlaceholderReference>
</ItemGroup>
<ItemGroup>
<None Include="tc_project_app.tmc">
<SubType>Content</SubType>
</None>
</ItemGroup>
<ProjectExtensions>
<PlcProjectOptions>
<XmlArchive>
<Data>
<o xml:space="preserve" t="OptionKey">
<v n="Name">"&lt;ProjectRoot&gt;"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
<o>
<v n="Name">"{192FAD59-8248-4824-A8DE-9177C94C195A}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
<v>{246001F4-279D-43AC-B241-948EB31120E1}</v>
<o>
<v n="Name">"{246001F4-279D-43AC-B241-948EB31120E1}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
<v>{29BD8D0C-3586-4548-BB48-497B9A01693F}</v>
<o>
<v n="Name">"{29BD8D0C-3586-4548-BB48-497B9A01693F}"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>Rules</v>
<o>
<v n="Name">"Rules"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
</d>
<d n="Values" t="Hashtable" />
</o>
<v>{8F99A816-E488-41E4-9FA3-846536012284}</v>
<o>
<v n="Name">"{8F99A816-E488-41E4-9FA3-846536012284}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
<v>{40450F57-0AA3-4216-96F3-5444ECB29763}</v>
<o>
<v n="Name">"{40450F57-0AA3-4216-96F3-5444ECB29763}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" ckt="String">
<v>ActiveVisuExtensionsLength</v>
<v>0</v>
<v>ActiveVisuProfile</v>
<v>"IR0whWr8bwfyBwAAHf+pawAAAABVAgAADnffSgAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDJUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgAyAC4AMQAwAAUWUAByAG8AZgBpAGwAZQBEAGEAdABhAAZMewAxADYAZQA1ADUAYgA2ADAALQA3ADAANAAzAC0ANABhADYAMwAtAGIANgA1AGIALQA2ADEANAA3ADEAMwA4ADcAOABkADQAMgB9AAcSTABpAGIAcgBhAHIAaQBlAHMACEx7ADMAYgBmAGQANQA0ADUAOQAtAGIAMAA3AGYALQA0AGQANgBlAC0AYQBlADEAYQAtAGEAOAAzADMANQA2AGEANQA1ADEANAAyAH0ACUx7ADkAYwA5ADUAOAA5ADYAOAAtADIAYwA4ADUALQA0ADEAYgBiAC0AOAA4ADcAMQAtADgAOQA1AGYAZgAxAGYAZQBkAGUAMQBhAH0ACg5WAGUAcgBzAGkAbwBuAAsGaQBuAHQADApVAHMAYQBnAGUADQpUAGkAdABsAGUADhpWAGkAcwB1AEUAbABlAG0ATQBlAHQAZQByAA8OQwBvAG0AcABhAG4AeQAQDFMAeQBzAHQAZQBtABESVgBpAHMAdQBFAGwAZQBtAHMAEjBWAGkAcwB1AEUAbABlAG0AcwBTAHAAZQBjAGkAYQBsAEMAbwBuAHQAcgBvAGwAcwATKFYAaQBzAHUARQBsAGUAbQBzAFcAaQBuAEMAbwBuAHQAcgBvAGwAcwAUJFYAaQBzAHUARQBsAGUAbQBUAGUAeAB0AEUAZABpAHQAbwByABUiVgBpAHMAdQBOAGEAdABpAHYAZQBDAG8AbgB0AHIAbwBsABYUdgBpAHMAdQBpAG4AcAB1AHQAcwAXDHMAeQBzAHQAZQBtABgYVgBpAHMAdQBFAGwAZQBtAEIAYQBzAGUAGSZEAGUAdgBQAGwAYQBjAGUAaABvAGwAZABlAHIAcwBVAHMAZQBkABoIYgBvAG8AbAAbIlAAbAB1AGcAaQBuAEMAbwBuAHMAdAByAGEAaQBuAHQAcwAcTHsANAAzAGQANQAyAGIAYwBlAC0AOQA0ADIAYwAtADQANABkADcALQA5AGUAOQA0AC0AMQBiAGYAZABmADMAMQAwAGUANgAzAGMAfQAdHEEAdABMAGUAYQBzAHQAVgBlAHIAcwBpAG8AbgAeFFAAbAB1AGcAaQBuAEcAdQBpAGQAHxZTAHkAcwB0AGUAbQAuAEcAdQBpAGQAIEhhAGYAYwBkADUANAA0ADYALQA0ADkAMQA0AC0ANABmAGUANwAtAGIAYgA3ADgALQA5AGIAZgBmAGUAYgA3ADAAZgBkADEANwAhFFUAcABkAGEAdABlAEkAbgBmAG8AIkx7AGIAMAAzADMANgA2AGEAOAAtAGIANQBjADAALQA0AGIAOQBhAC0AYQAwADAAZQAtAGUAYgA4ADYAMAAxADEAMQAwADQAYwAzAH0AIw5VAHAAZABhAHQAZQBzACRMewAxADgANgA4AGYAZgBjADkALQBlADQAZgBjAC0ANAA1ADMAMgAtAGEAYwAwADYALQAxAGUAMwA5AGIAYgA1ADUANwBiADYAOQB9ACVMewBhADUAYgBkADQAOABjADMALQAwAGQAMQA3AC0ANAAxAGIANQAtAGIAMQA2ADQALQA1AGYAYwA2AGEAZAAyAGIAOQA2AGIANwB9ACYWTwBiAGoAZQBjAHQAcwBUAHkAcABlACdUVQBwAGQAYQB0AGUATABhAG4AZwB1AGEAZwBlAE0AbwBkAGUAbABGAG8AcgBDAG8AbgB2AGUAcgB0AGkAYgBsAGUATABpAGIAcgBhAHIAaQBlAHMAKBBMAGkAYgBUAGkAdABsAGUAKRRMAGkAYgBDAG8AbQBwAGEAbgB5ACoeVQBwAGQAYQB0AGUAUAByAG8AdgBpAGQAZQByAHMAKzhTAHkAcwB0AGUAbQAuAEMAbwBsAGwAZQBjAHQAaQBvAG4AcwAuAEgAYQBzAGgAdABhAGIAbABlACwSdgBpAHMAdQBlAGwAZQBtAHMALUg2AGMAYgAxAGMAZABlADEALQBkADUAZABjAC0ANABhADMAYgAtADkAMAA1ADQALQAyADEAZgBhADcANQA2AGEAMwBmAGEANAAuKEkAbgB0AGUAcgBmAGEAYwBlAFYAZQByAHMAaQBvAG4ASQBuAGYAbwAvTHsAYwA2ADEAMQBlADQAMAAwAC0ANwBmAGIAOQAtADQAYwAzADUALQBiADkAYQBjAC0ANABlADMAMQA0AGIANQA5ADkANgA0ADMAfQAwGE0AYQBqAG8AcgBWAGUAcgBzAGkAbwBuADEYTQBpAG4AbwByAFYAZQByAHMAaQBvAG4AMgxMAGUAZwBhAGMAeQAzMEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwAVgBlAHIAcwBpAG8AbgBJAG4AZgBvADQwTABvAGEAZABMAGkAYgByAGEAcgBpAGUAcwBJAG4AdABvAFAAcgBvAGoAZQBjAHQANRpDAG8AbQBwAGEAdABpAGIAaQBsAGkAdAB5ANAAAhoD0AMBLQTQBQYaB9AHCBoBRQcJCNAACRoERQoLBAMAAAAFAAAACgAAAAAAAADQDAutAgAAANANAS0O0A8BLRDQAAkaBEUKCwQDAAAABQAAAAoAAAAoAAAA0AwLrQEAAADQDQEtEdAPAS0Q0AAJGgRFCgsEAwAAAAUAAAAKAAAAAAAAANAMC60CAAAA0A0BLRLQDwEtENAACRoERQoLBAMAAAAFAAAACgAAACgAAADQDAutAgAAANANAS0T0A8BLRDQAAkaBEUKCwQDAAAABQAAAAoAAAAKAAAA0AwLrQIAAADQDQEtFNAPAS0Q0AAJGgRFCgsEAwAAAAUAAAAKAAAAKAAAANAMC60CAAAA0A0BLRXQDwEtENAACRoERQoLBAMAAAAFAAAACgAAAAAAAADQDAutAgAAANANAS0W0A8BLRfQAAkaBEUKCwQDAAAABQAAAAoAAAAoAAAA0AwLrQQAAADQDQEtGNAPAS0Q0BkarQFFGxwB0AAcGgJFHQsEAwAAAAUAAAAKAAAAAAAAANAeHy0g0CEiGgJFIyQC0AAlGgVFCgsEAwAAAAMAAAAAAAAACgAAANAmC60AAAAA0AMBLSfQKAEtEdApAS0Q0AAlGgVFCgsEAwAAAAMAAAAAAAAACgAAANAmC60BAAAA0AMBLSfQKAEtEdApAS0QmiorAUUAAQLQAAEtLNAAAS0X0AAfLS3QLi8aA9AwC60BAAAA0DELrRMAAADQMhqtANAzLxoD0DALrQIAAADQMQutAwAAANAyGq0A0DQarQDQNRqtAA=="</v>
</d>
</o>
</d>
<d n="Values" t="Hashtable" />
</o>
</Data>
<TypeList>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="Int32">System.Int32</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</PlcProjectOptions>
</ProjectExtensions>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FileVersion>1.0.0.0</FileVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{fb261665-fd20-4bf2-97f8-2854c82b752d}</ProjectGuid>
<SubObjectsSortedByName>True</SubObjectsSortedByName>
<Name>tc_project_app</Name>
<ProgramVersion>3.1.4022.6</ProgramVersion>
<Application>{047dee04-c246-47b2-8ccc-a15e36987c43}</Application>
<TypeSystem>{ae4eb5ee-6030-47a6-bf35-5a6afd9efeeb}</TypeSystem>
<Implicit_Task_Info>{5ef19bd0-aca2-493f-b2a1-89e363647697}</Implicit_Task_Info>
<Implicit_KindOfTask>{f52f0efe-1be1-4600-94a9-9aa59fdf8e4e}</Implicit_KindOfTask>
<Implicit_Jitter_Distribution>{26d08e27-a705-49a9-95de-a3a0b6ea049c}</Implicit_Jitter_Distribution>
<LibraryReferences>{577f21c4-8eb2-4f2c-a24e-4c3f62ca96d2}</LibraryReferences>
<AutoUpdateVisuProfile>true</AutoUpdateVisuProfile>
<Released>false</Released>
</PropertyGroup>
<ItemGroup>
<Compile Include="GlobalTextList.TcGTLO">
<SubType>Code</SubType>
</Compile>
<Compile Include="GVLs\GVL_APP.TcGVL">
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="PlcTask.TcTTO">
<SubType>Code</SubType>
</Compile>
<Compile Include="POUs\MAIN.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\RestorePosition.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisConfig.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisControl.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\MotionFunctions.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisInputs.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisPersistent.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_GearAxis.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisStatus.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\DUTs\ST_AxisStruct.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\GVLs\GVL.TcGVL">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_ReadFloatParameter.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_ReadParameterInNc_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_WriteFloatParameter.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\ChangeConfig\FB_WriteParameterInNc_v1_00.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\FB_Axis.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeDirect.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeFinish.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomePrepare.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeReadNcVelocities.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeReadSoftLimEnable.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeToSwitch.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeVirtual.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeWriteNcVelocities.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_HomeWriteSoftLimEnable.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\Motion\Homing\FB_Homing.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\VISUs\Error_Log_Visu.TcVIS">
<SubType>Code</SubType>
<DependentUpon>Visualization Manager.TcVMO</DependentUpon>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\VISUs\languageSupport.TcTLO">
<SubType>Code</SubType>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\VISUs\MainVisu.TcVIS">
<SubType>Code</SubType>
<DependentUpon>Visualization Manager.TcVMO</DependentUpon>
</Compile>
<Compile Include="tc_mca_std_lib\POUs\VISUs\visuTextLinks.TcTLO">
<SubType>Code</SubType>
</Compile>
<Compile Include="Test\app_tests\tcUNIT_APP_RUN.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="Test\common\FB_tcUNIT_common.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="Test\common\tcUNIT_GVL.TcGVL">
<SubType>Code</SubType>
</Compile>
<Compile Include="Test\standard_library_tests\FB_Axis_TEST.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="Test\standard_library_tests\tcUNIT_STD_LIB_RUN.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="Visualization Manager.TcVMO">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="DUTs" />
<Folder Include="GVLs" />
<Folder Include="Test" />
<Folder Include="tc_mca_std_lib" />
<Folder Include="tc_mca_std_lib\DUTs" />
<Folder Include="tc_mca_std_lib\GVLs" />
<Folder Include="tc_mca_std_lib\POUs" />
<Folder Include="tc_mca_std_lib\POUs\ChangeConfig" />
<Folder Include="tc_mca_std_lib\POUs\Motion" />
<Folder Include="tc_mca_std_lib\POUs\Motion\Homing" />
<Folder Include="tc_mca_std_lib\POUs\VISUs" />
<Folder Include="Test\app_tests" />
<Folder Include="Test\common" />
<Folder Include="Test\standard_library_tests" />
<Folder Include="VISUs" />
<Folder Include="POUs" />
</ItemGroup>
<ItemGroup>
<PlaceholderReference Include="System_VisuElemMeter">
<DefaultResolution>VisuElemMeter, 3.5.13.0 (System)</DefaultResolution>
<Namespace>VisuElemMeter</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElems">
<DefaultResolution>VisuElems, 3.5.13.21 (System)</DefaultResolution>
<Namespace>VisuElems</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElemsSpecialControls">
<DefaultResolution>VisuElemsSpecialControls, 3.5.13.0 (System)</DefaultResolution>
<Namespace>VisuElemsSpecialControls</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElemsWinControls">
<DefaultResolution>VisuElemsWinControls, 3.5.13.20 (System)</DefaultResolution>
<Namespace>VisuElemsWinControls</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuElemTextEditor">
<DefaultResolution>VisuElemTextEditor, 3.5.13.0 (System)</DefaultResolution>
<Namespace>VisuElemTextEditor</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="system_visuinputs">
<DefaultResolution>visuinputs, 3.5.13.0 (system)</DefaultResolution>
<Namespace>visuinputs</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="System_VisuNativeControl">
<DefaultResolution>VisuNativeControl, 3.5.13.0 (System)</DefaultResolution>
<Namespace>VisuNativeControl</Namespace>
<SystemLibrary>true</SystemLibrary>
<ResolverGuid>2717eb6a-dd07-4c66-8d8d-cacebd7b18ae</ResolverGuid>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_EtherCAT">
<DefaultResolution>Tc2_EtherCAT, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_EtherCAT</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_MC2">
<DefaultResolution>Tc2_MC2, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_MC2</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_Standard">
<DefaultResolution>Tc2_Standard, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Standard</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_SUPS">
<DefaultResolution>Tc2_SUPS, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_SUPS</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_System">
<DefaultResolution>Tc2_System, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_System</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_Utilities">
<DefaultResolution>Tc2_Utilities, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Utilities</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc3_MC2_AdvancedHoming">
<DefaultResolution>Tc3_MC2_AdvancedHoming, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_MC2_AdvancedHoming</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc3_Module">
<DefaultResolution>Tc3_Module, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_Module</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="TcUnit">
<DefaultResolution>TcUnit, * (www.tcunit.org)</DefaultResolution>
<Namespace>TcUnit</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="VisuDialogs">
<DefaultResolution>VisuDialogs, * (System)</DefaultResolution>
<Namespace>VisuDialogs</Namespace>
</PlaceholderReference>
</ItemGroup>
<ItemGroup>
<None Include="tc_project_app.tmc">
<SubType>Content</SubType>
</None>
</ItemGroup>
<ItemGroup>
<PlaceholderResolution Include="Tc2_MC2">
<Resolution>Tc2_MC2, 3.3.28.0 (Beckhoff Automation GmbH)</Resolution>
</PlaceholderResolution>
</ItemGroup>
<ProjectExtensions>
<PlcProjectOptions>
<XmlArchive>
<Data>
<o xml:space="preserve" t="OptionKey">
<v n="Name">"&lt;ProjectRoot&gt;"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>{192FAD59-8248-4824-A8DE-9177C94C195A}</v>
<o>
<v n="Name">"{192FAD59-8248-4824-A8DE-9177C94C195A}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
<v>{246001F4-279D-43AC-B241-948EB31120E1}</v>
<o>
<v n="Name">"{246001F4-279D-43AC-B241-948EB31120E1}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" ckt="String" cvt="Boolean">
<v>UnicodeStrings</v>
<v>False</v>
</d>
</o>
<v>{29BD8D0C-3586-4548-BB48-497B9A01693F}</v>
<o>
<v n="Name">"{29BD8D0C-3586-4548-BB48-497B9A01693F}"</v>
<d n="SubKeys" t="Hashtable" ckt="String" cvt="OptionKey">
<v>Rules</v>
<o>
<v n="Name">"Rules"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
</d>
<d n="Values" t="Hashtable" />
</o>
<v>{8F99A816-E488-41E4-9FA3-846536012284}</v>
<o>
<v n="Name">"{8F99A816-E488-41E4-9FA3-846536012284}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" />
</o>
<v>{40450F57-0AA3-4216-96F3-5444ECB29763}</v>
<o>
<v n="Name">"{40450F57-0AA3-4216-96F3-5444ECB29763}"</v>
<d n="SubKeys" t="Hashtable" />
<d n="Values" t="Hashtable" ckt="String">
<v>ActiveVisuExtensionsLength</v>
<v>0</v>
<v>ActiveVisuProfile</v>
<v>"IR0whWr8bwfwBwAAhiaVXgAAAABVAgAAWdTSaQAAAAABAAAAAAAAAAEaUwB5AHMAdABlAG0ALgBTAHQAcgBpAG4AZwACTHsAZgA5ADUAYgBiADQAMgA2AC0ANQA1ADIANAAtADQAYgA0ADUALQA5ADQAMAAwAC0AZgBiADAAZgAyAGUANwA3AGUANQAxAGIAfQADCE4AYQBtAGUABDBUAHcAaQBuAEMAQQBUACAAMwAuADEAIABCAHUAaQBsAGQAIAA0ADAAMgA0AC4AMAAFFlAAcgBvAGYAaQBsAGUARABhAHQAYQAGTHsAMQA2AGUANQA1AGIANgAwAC0ANwAwADQAMwAtADQAYQA2ADMALQBiADYANQBiAC0ANgAxADQANwAxADMAOAA3ADgAZAA0ADIAfQAHEkwAaQBiAHIAYQByAGkAZQBzAAhMewAzAGIAZgBkADUANAA1ADkALQBiADAANwBmAC0ANABkADYAZQAtAGEAZQAxAGEALQBhADgAMwAzADUANgBhADUANQAxADQAMgB9AAlMewA5AGMAOQA1ADgAOQA2ADgALQAyAGMAOAA1AC0ANAAxAGIAYgAtADgAOAA3ADEALQA4ADkANQBmAGYAMQBmAGUAZABlADEAYQB9AAoOVgBlAHIAcwBpAG8AbgALBmkAbgB0AAwKVQBzAGEAZwBlAA0KVABpAHQAbABlAA4aVgBpAHMAdQBFAGwAZQBtAE0AZQB0AGUAcgAPDkMAbwBtAHAAYQBuAHkAEAxTAHkAcwB0AGUAbQARElYAaQBzAHUARQBsAGUAbQBzABIwVgBpAHMAdQBFAGwAZQBtAHMAUwBwAGUAYwBpAGEAbABDAG8AbgB0AHIAbwBsAHMAEyhWAGkAcwB1AEUAbABlAG0AcwBXAGkAbgBDAG8AbgB0AHIAbwBsAHMAFCRWAGkAcwB1AEUAbABlAG0AVABlAHgAdABFAGQAaQB0AG8AcgAVIlYAaQBzAHUATgBhAHQAaQB2AGUAQwBvAG4AdAByAG8AbAAWFHYAaQBzAHUAaQBuAHAAdQB0AHMAFwxzAHkAcwB0AGUAbQAYGFYAaQBzAHUARQBsAGUAbQBCAGEAcwBlABkmRABlAHYAUABsAGEAYwBlAGgAbwBsAGQAZQByAHMAVQBzAGUAZAAaCGIAbwBvAGwAGyJQAGwAdQBnAGkAbgBDAG8AbgBzAHQAcgBhAGkAbgB0AHMAHEx7ADQAMwBkADUAMgBiAGMAZQAtADkANAAyAGMALQA0ADQAZAA3AC0AOQBlADkANAAtADEAYgBmAGQAZgAzADEAMABlADYAMwBjAH0AHRxBAHQATABlAGEAcwB0AFYAZQByAHMAaQBvAG4AHhRQAGwAdQBnAGkAbgBHAHUAaQBkAB8WUwB5AHMAdABlAG0ALgBHAHUAaQBkACBIYQBmAGMAZAA1ADQANAA2AC0ANAA5ADEANAAtADQAZgBlADcALQBiAGIANwA4AC0AOQBiAGYAZgBlAGIANwAwAGYAZAAxADcAIRRVAHAAZABhAHQAZQBJAG4AZgBvACJMewBiADAAMwAzADYANgBhADgALQBiADUAYwAwAC0ANABiADkAYQAtAGEAMAAwAGUALQBlAGIAOAA2ADAAMQAxADEAMAA0AGMAMwB9ACMOVQBwAGQAYQB0AGUAcwAkTHsAMQA4ADYAOABmAGYAYwA5AC0AZQA0AGYAYwAtADQANQAzADIALQBhAGMAMAA2AC0AMQBlADMAOQBiAGIANQA1ADcAYgA2ADkAfQAlTHsAYQA1AGIAZAA0ADgAYwAzAC0AMABkADEANwAtADQAMQBiADUALQBiADEANgA0AC0ANQBmAGMANgBhAGQAMgBiADkANgBiADcAfQAmFk8AYgBqAGUAYwB0AHMAVAB5AHAAZQAnVFUAcABkAGEAdABlAEwAYQBuAGcAdQBhAGcAZQBNAG8AZABlAGwARgBvAHIAQwBvAG4AdgBlAHIAdABpAGIAbABlAEwAaQBiAHIAYQByAGkAZQBzACgQTABpAGIAVABpAHQAbABlACkUTABpAGIAQwBvAG0AcABhAG4AeQAqHlUAcABkAGEAdABlAFAAcgBvAHYAaQBkAGUAcgBzACs4UwB5AHMAdABlAG0ALgBDAG8AbABsAGUAYwB0AGkAbwBuAHMALgBIAGEAcwBoAHQAYQBiAGwAZQAsEnYAaQBzAHUAZQBsAGUAbQBzAC1INgBjAGIAMQBjAGQAZQAxAC0AZAA1AGQAYwAtADQAYQAzAGIALQA5ADAANQA0AC0AMgAxAGYAYQA3ADUANgBhADMAZgBhADQALihJAG4AdABlAHIAZgBhAGMAZQBWAGUAcgBzAGkAbwBuAEkAbgBmAG8AL0x7AGMANgAxADEAZQA0ADAAMAAtADcAZgBiADkALQA0AGMAMwA1AC0AYgA5AGEAYwAtADQAZQAzADEANABiADUAOQA5ADYANAAzAH0AMBhNAGEAagBvAHIAVgBlAHIAcwBpAG8AbgAxGE0AaQBuAG8AcgBWAGUAcgBzAGkAbwBuADIMTABlAGcAYQBjAHkAMzBMAGEAbgBnAHUAYQBnAGUATQBvAGQAZQBsAFYAZQByAHMAaQBvAG4ASQBuAGYAbwA0MEwAbwBhAGQATABpAGIAcgBhAHIAaQBlAHMASQBuAHQAbwBQAHIAbwBqAGUAYwB0ADUaQwBvAG0AcABhAHQAaQBiAGkAbABpAHQAeQDQAAIaA9ADAS0E0AUGGgfQBwgaAUUHCQjQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtDtAPAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAFQAAANAMC60BAAAA0A0BLRHQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0S0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAUAAAA0AwLrQIAAADQDQEtE9APAS0Q0AAJGgRFCgsEAwAAAAUAAAANAAAAAAAAANAMC60CAAAA0A0BLRTQDwEtENAACRoERQoLBAMAAAAFAAAADQAAAAAAAADQDAutAgAAANANAS0V0A8BLRDQAAkaBEUKCwQDAAAABQAAAA0AAAAAAAAA0AwLrQIAAADQDQEtFtAPAS0X0AAJGgRFCgsEAwAAAAUAAAANAAAAFQAAANAMC60EAAAA0A0BLRjQDwEtENAZGq0BRRscAdAAHBoCRR0LBAMAAAAFAAAADQAAAAAAAADQHh8tINAhIhoCRSMkAtAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAAAAANADAS0n0CgBLRHQKQEtENAAJRoFRQoLBAMAAAADAAAAAAAAAAoAAADQJgutAQAAANADAS0n0CgBLRHQKQEtEJoqKwFFAAEC0AABLSzQAAEtF9AAHy0t0C4vGgPQMAutAQAAANAxC60XAAAA0DIarQDQMy8aA9AwC60CAAAA0DELrQMAAADQMhqtANA0Gq0A0DUarQA="</v>
</d>
</o>
</d>
<d n="Values" t="Hashtable" />
</o>
</Data>
<TypeList>
<Type n="Boolean">System.Boolean</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="Int32">System.Int32</Type>
<Type n="OptionKey">{54dd0eac-a6d8-46f2-8c27-2f43c7e49861}</Type>
<Type n="String">System.String</Type>
</TypeList>
</XmlArchive>
</PlcProjectOptions>
</ProjectExtensions>
</Project>
+44
View File
@@ -0,0 +1,44 @@
import glob
import xml.etree.ElementTree as ET
VERSION_TAGS = {"**/*.Tc*": "ProductVersion", "**/*.tsproj": "TcVersion"}
CORRECT_VERSIONS = {"**/*.Tc*": "3.1.4024.0", "**/*.tsproj": "3.1.4023.119"}
def check_versions():
"""
Checks the Twincat version used to create a file.
It assumes that the version is stored as an attribute on the top element of the file, the attribute names are
listed in VERSION_TAGS.
:return: A dictionary of incorrect files and their version numbers
"""
incorrect_files_exp = dict()
incorrect_files_act = dict()
for file_path, version_attrib in VERSION_TAGS.items():
correct_version = CORRECT_VERSIONS[file_path]
found_files = glob.glob(file_path, recursive=True)
if not found_files:
raise IOError("ERROR: No files of type {} found".format(file_path))
for file in found_files:
tree = ET.parse(file)
try:
found_version = tree.getroot().attrib[version_attrib]
if found_version != correct_version:
incorrect_files_exp[file] = correct_version
incorrect_files_act[file] = found_version
except KeyError:
print("WARNING: No version found for {}".format(file))
return incorrect_files_exp, incorrect_files_act
if __name__ == "__main__":
try:
incorrect_files_exp, incorrect_files_act = check_versions()
for file, version in incorrect_files_act.items():
correct_version = incorrect_files_exp[file]
print("ERROR: {} has incorrect version {}, expected version {}".format(file, version, correct_version))
if incorrect_files_act:
exit(1)
except IOError as e:
print(e) # Likely no files found
exit(2)