Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • silecs/opensilecs
  • k.fugiel/opensilecs
  • s.kupiecki/opensilecs
3 results
Show changes
Commits on Source (3)
Showing
with 730 additions and 627 deletions
lxml
xmlschema
\ No newline at end of file
import os
from setuptools import setup, find_packages
__version__ = "0.1.0"
__description__ = "Script in order to model PLC devices in FESA by using the Silecs framework"
with open('requirements.txt') as f:
required = f.read().splitlines()
setup(
name="opensilecs",
version=__version__,
description=__description__,
url="https://git.gsi.de/silecs/opensilecs/-/tree/master/silecs-cli",
url="https://git.gsi.de/silecs/opensilecs",
author="GSI",
license="GPLv3",
packages=find_packages(),
install_requires=[
'lxml',
],
entry_points={"console_scripts": ['silecs = silecs_cli.silecs:run']},
install_requires=required
)
\ No newline at end of file
......@@ -374,6 +374,11 @@
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:assert test="if (@model != 'M340')
then true()
else if(@base-address mod 2 = 0)
then true()
else false()" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
......@@ -432,6 +437,11 @@
</xs:appinfo>
</xs:annotation>
</xs:attribute>
<xs:assert test="if (@model != 'CX9020')
then true()
else if(@base-address mod 2 = 0)
then true()
else false()" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
......
......@@ -2,4 +2,15 @@
Command line tool for silecs project creation, xml validation, code generation, etc.
Component of the opensilecs PLC-framework.
\ No newline at end of file
Component of the opensilecs PLC-framework.
## Tests
In [tests](tests) directory there is a file [tests_silecs.py](tests/tests_silecs.py) containg unit tests written using `unittest` framework.
Directory [testClasses](tests/testClasses) contain example classes uses for tests and some extra example files used for tests are provided in directory [examples](tests/examples).
Tests can be run using following command:
```
python3 -m unittest
```
......@@ -6,8 +6,10 @@ import datetime
import shutil
import subprocess
import lxml.etree
from xml.dom import minidom
from packaging import version
import xmlschema
SILECS_VERSION = "2.3.0"
SILECSDESIGN = "silecsdesign"
......@@ -22,16 +24,14 @@ FESA_BASE=f"/opt/fesa/fesa-fwk/{FESA_VERSION}"
FESA_XSD=f"{FESA_BASE}/fesa-model-gsi/xml/deployment/deployment-gsi.xsd"
FESA_GSI_TEMPLATE=f"{FESA_BASE}/fesa-model-gsi/xml/design/templates/GSIClassTemplate.xml"
# silecs specific variables
try:
SILECS_BASE=(os.environ['SILECS_BASE'])
except KeyError:
SILECS_BASE=f"/common/usr/cscofe/silecs/{SILECS_VERSION}"
SILECS_BASE = f".."
DESIGN_SHEMA_PATH = f"{SILECS_BASE}/silecs-model/src/xml/DesignSchema.xsd"
DEPLOY_SHEMA_PATH = f"{SILECS_BASE}/silecs-model/src/xml/DeploySchema.xsd"
DESIGN_SHEMA_PATH = f"{SILECS_BASE}/silecs-model/xml/DesignSchema.xsd"
DEPLOY_SHEMA_PATH = f"{SILECS_BASE}/silecs-model/xml/DeploySchema.xsd"
SILECS_CODEGEN_BASE=f"{SILECS_BASE}/silecs-codegen/xml/"
SILECS_CODEGEN_MIGRATION=f"{SILECS_BASE}/silecs-codegen/xml/migration"
......@@ -39,6 +39,12 @@ SILECS_CODEGEN_MIGRATION=f"{SILECS_BASE}/silecs-codegen/xml/migration"
# See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/4
SILECS_CODEGEN_FESA=f"{SILECS_BASE}/silecs-codegen/xml/fesa/fesa_7_3_0/"
try:
RELEASE_PARAM_DIR=(os.environ['RELEASE_PARAM_DIR'])
except KeyError:
RELEASE_PARAM_DIR="/common/export/fesa/local"
# import files for generating sources
sys.path.append(SILECS_CODEGEN_BASE)
sys.path.append(SILECS_CODEGEN_MIGRATION)
......@@ -72,6 +78,8 @@ class SilecsArgumentParser(argparse.ArgumentParser):
"\t To add missing properties and value-items specified in 'MyClass.silecsdesign' into the FESA document 'MyClass.design'.\n" \
"\t This will as well ate C++ code.\n" \
"\t\t silces -g ~/workspace/MyClass/src/MyClass.silecsdesign\n\n" \
"\t To release silecs deploy param to FEC specific FESA release directory.\n" \
"\t\t silces -r ~/workspace/MyClass_DU/src/MyClass_DU.silecsdeploy\n\n" \
"\nCheck the Silecs Wiki for more info: https://www-acc.gsi.de/wiki/Frontend/SILECS\n" \
print(examples)
......@@ -92,6 +100,12 @@ def get_project_name(filepath):
"""
return os.path.splitext(os.path.basename(filepath))[0]
def get_filename(filepath):
"""Get filename from path
eg. workspace/TestClass/src/TestClass.silecsdesign -> TestClass.silecsdesign
"""
_, filename = os.path.split(filepath)
return filename
def get_project_dir(filepath):
"""Get project dir
......@@ -141,21 +155,26 @@ def create_backup_file(filepath):
def validate(silecs_design_deploy_path, xsd_path):
"""Validate silecs design deploy"""
validation_result = True
try:
print(f"validating {silecs_design_deploy_path}")
xmlschema_doc = lxml.etree.parse(xsd_path)
xmlschema = lxml.etree.XMLSchema(xmlschema_doc)
xml_doc = lxml.etree.parse(silecs_design_deploy_path)
result = xmlschema.validate(xml_doc)
return result
schema = xmlschema.XMLSchema11(xsd_path)
try:
schema.validate(silecs_design_deploy_path)
except xmlschema.validators.exceptions.XMLSchemaValidationError as e:
print(e)
validation_result = False
return validation_result
except OSError as e:
print(e)
return False
except Exception as e:
except (lxml.etree.DocumentInvalid, OSError, Exception) as e:
print(e)
return False
# TODO: Implement jave-rules - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/3
def silecs_validate(file_paths):
for path in file_paths:
......@@ -163,9 +182,9 @@ def silecs_validate(file_paths):
xsd_path = get_schema_path(path)
val_result = validate(path, xsd_path)
if val_result:
print("File is valid")
print("\nFile is valid")
else:
print("File is not valid. Check errors above.")
print("\nFile is not valid. Check errors above.")
except Exception as e:
print(e)
......@@ -349,10 +368,86 @@ def silecs_diagnostic_tool(filepath):
##### Release parameter file ######
def copy_param_file(fesa_fec_name, param_file_src, project_name):
"""Copy file from param_file_src to the default, FEC specific FESA release directory (RELEASE_PARAM_DIR/fesa_fec_name/project_name)
and development directory (RELEASE_PARAM_DIR/fesa_fec_name/project_name-d) .
"""
fesa_fec_dst_folder = os.path.join(RELEASE_PARAM_DIR, fesa_fec_name, f"{project_name}")
fesa_fec_dst_folder_dev = fesa_fec_dst_folder + "-d"
fesa_fec_dst_folders = [fesa_fec_dst_folder_dev, fesa_fec_dst_folder]
for fesa_fec_dst in fesa_fec_dst_folders:
if not os.path.isdir(fesa_fec_dst):
print(f"Generating folder-structures for FEC: {os.path.abspath(fesa_fec_dst)}")
os.makedirs(fesa_fec_dst)
print("Folder generated")
param_file_name = get_filename(param_file_src)
fesa_fec_dst_file = os.path.join(fesa_fec_dst, param_file_name)
print(f"Installing parameter-file {param_file_name} to {fesa_fec_dst}.")
with open(fesa_fec_dst_file, 'w+'):
shutil.copyfile(src=param_file_src, dst=fesa_fec_dst_file)
def release(filepath):
"""Copy generated silecs deploy parameter files to directory"""
filepath = os.path.abspath(filepath)
project_path = get_project_path(filepath)
project_name = get_project_name(filepath)
param_dir = os.path.join(project_path, "generated-silecs", "client")
extension = get_extension(filepath)
if extension != SILECSDEPLOY:
print(f"Error: you need to provide {SILECSDEPLOY} file")
return False
try:
silecs_deploy_document = minidom.parse(filepath)
controller_nodes = silecs_deploy_document.getElementsByTagName("Controller")
for controller in controller_nodes:
host_name = controller.getAttribute("host-name")
plc_nodes = controller.childNodes
plc_element = None
for plc in plc_nodes:
if plc.nodeType == minidom.Node.ELEMENT_NODE:
plc_element = plc
break
if not plc_element:
raise Exception(f"No concrete plc defined for controller: {host_name}")
device_nodes = plc_element.getElementsByTagName("Device")
fesa_fec_name = None
for device in device_nodes:
fesa_fec_name = device.getAttribute("fesa-fec-name")
device_label = device.getAttribute("silecs-device-label")
if not fesa_fec_name:
print(f"Skipping controller: {host_name} Reason:")
print(f"For silecs-device {device_label} the attribute @fesa-fec-name is not define")
continue
param_file_name = f"{host_name}.silecsparam"
param_file_path = os.path.abspath(os.path.join(param_dir, param_file_name))
if not os.path.isfile(param_file_path):
print(f"Skipping controller: {host_name} Reason:")
print(f"No parameter file found for this controller. Did you run the code-generation ?")
continue
copy_param_file(fesa_fec_name, param_file_path, project_name)
return True
except Exception as e:
print(e)
return False
def silecs_release(file_paths):
# TODO - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/5
print("Not implemented yet .. please copy the param file by hand for now")
for filepath in file_paths:
release_result = release(filepath)
if release_result:
print("Release successfull")
else:
print("Error during release. Check errors above.")
##### Migrate file to new silecs version ######
......@@ -411,8 +506,9 @@ def _parse_arguments():
parser.add_argument(
"-r",
"--release",
metavar="file",
help="release parameter file fo FEC (TODO)"
nargs="+",
metavar="silecsdeploy",
help="release parameter file fo FEC for silecsdeploy file"
)
parser.add_argument(
......
#!/bin/sh
# File/Project has to be the last argument
FILE=${@:$#}
PROJECT_NAME=$(echo "${FILE##*/}" | sed 's/\.[^.]*$//')
SCRIPT=$(readlink -f "$0")
SILECS_VERSION=2.3.0
# Prefill $SILECS_BASE with a local path, if you want to test a local installation
if [ -z $SILECS_BASE ]; then
SILECS_BASE=/common/usr/cscofe/silecs/${SILECS_VERSION}
fi
echo "using sileces base path: $SILECS_BASE"
FESA_VERSION=7.4.0
FESA_BASE=/opt/fesa/fesa-fwk/$FESA_VERSION
N_ARGUMENTS=$#
function help {
echo -e ""
echo -e "Usage: silecs [OPTION] [FILE]"
echo -e ""
echo -e "Script in order to model PLC devices in FESA by using the Silecs framework."
echo -e ""
echo -e "\t -c \t create new .silecsdesign/.silecsdeploy file for the specified FESA .design/.deploy file"
echo -e "\t -v \t validate silecs xml file"
echo -e "\t -g \t generate source code for silecs xml file"
echo -e "\t -d \t start diagnostic tool for silecs xml file"
echo -e "\t -r \t release parameter file to FEC (TODO)"
echo -e "\t -m \t migrate silecs design/deploy file to new silecs version (TODO)"
echo -e "\t -h \t show this help"
echo -e ""
echo -e "Examples:"
echo -e ""
echo -e "\t To create a new file 'MyClass.silecsdesign' for the FESA class."
echo -e "\t\t silces -c ~/workspace/MyClass/src/MyClass.design"
echo -e ""
echo -e "\t To validate 'MyClass.silecsdesign'."
echo -e "\t\t silces -v ~/workspace/MyClass/src/MyClass.silecsdesign"
echo -e ""
echo -e "\t To add missing properties and value-items specified in 'MyClass.silecsdesign' into the FESA document 'MyClass.design'."
echo -e "\t This will as well ate C++ code."
echo -e "\t\t silces -g ~/workspace/MyClass/src/MyClass.silecsdesign"
echo -e ""
echo -e "Check the Silecs Wiki for more info: https://www-acc.gsi.de/wiki/Frontend/SILECS"
echo -e ""
exit 1;
}
if [ $N_ARGUMENTS -lt 1 ]
then
echo "Error: Wrong number of arguments supplied."
help
fi
function assert_n_arguments {
if [ $N_ARGUMENTS -lt $1 ]
then
echo "Error: Wrong number of arguments supplied."
help
fi
}
function silecs_validate {
assert_n_arguments 2
EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
# Resolve possible relative path
FILE=$(realpath "$FILE" )
case $EXTENSION in
silecsdesign)
SCHEMA=$SILECS_BASE/silecs-model/xml/DesignSchema.xsd
;;
silecsdeploy)
SCHEMA=$SILECS_BASE/silecs-model/xml/DeploySchema.xsd
;;
*)
echo "Error: Passed file for validation needs to have the extension '.silecsdesign' or '.silecsdeploy'"
exit 1
;;
esac
echo "validating $FILE"
echo ""
xmllint --schema $SCHEMA $FILE --noout
RESULT=$?
echo ""
if [ $RESULT -eq 0 ]
then
echo "File is valid"
else
echo "File is not valid. Check errors above."
fi
return $RESULT
# TODO: Implement jave-rules - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/3
}
function execute_python {
PYTHON_FILE=$1
PYTHON_METHOD=$2
SILECS_CODEGEN_BASE=$SILECS_BASE/silecs-codegen/xml/
SILECS_CODEGEN_MIGRATION=$SILECS_BASE/silecs-codegen/xml/migration
# TODO: Check for concrete fesa version - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/4
SILECS_CODEGEN_FESA=$SILECS_BASE/silecs-codegen/xml/fesa/fesa_7_3_0/
ARGUMENTS=""
for ((i=3; i<=$#; i++))
do
ARGUMENTS+="'"
ARGUMENTS+=${!i}
ARGUMENTS+="'"
if [ $i -ne $# ]
then
ARGUMENTS+=","
fi
done
#echo $ARGUMENTS
python3 -c "import sys;\
sys.path.append('$SILECS_CODEGEN_BASE');\
sys.path.append('$SILECS_CODEGEN_MIGRATION');\
sys.path.append('$SILECS_CODEGEN_FESA');\
import $PYTHON_FILE;\
$PYTHON_FILE.$PYTHON_METHOD($ARGUMENTS);"
return $?
}
function silecs_generate {
assert_n_arguments 2
silecs_validate
if [ $? -ne 0 ]; then
echo ""
echo "Error: $FILE is not valid. Please fix all xml errors before generating code !"
exit 1
fi
# Resolve possible relative path
FILE=$(realpath "$FILE" )
EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
case $EXTENSION in
silecsdesign)
silecs_generate_silecsdesign
;;
silecsdeploy)
silecs_generate_silecsdeploy
;;
*)
echo "Error: Passed file for code generation needs to have the exctension '.silecsdesign' or '.silecsdeploy'"
exit 1
;;
esac
}
function silecs_generate_silecsdesign {
SILECS_DESIGN_FILE=$FILE
PROJECT_PATH=$(dirname "$(dirname "$FILE")")
WORKSPACE_PATH=$(dirname "$PROJECT_PATH")
SILECS_LIBRARY_BASE=$SILECS_BASE/silecs-communication-cpp
FESA_DESIGN_FILE=$PROJECT_PATH/src/$PROJECT_NAME.design
FESA_XSD=$FESA_BASE/fesa-model-gsi/xml/design/design-gsi.xsd
echo "generating code for $PROJECT_NAME ..."
echo ""
if [ -f $FESA_DESIGN_FILE ];
then
echo "Please note that old, obsolete xml-elements are not deleted automatically! Sometimes this can lead to an invalid FESA Design document!"
echo "If this is the case, please remove the obsolete elements by hand."
echo "Creating a backup of the existing FESA file at: $FESA_DESIGN_FILE.backup"
echo ""
cp $FESA_DESIGN_FILE $FESA_DESIGN_FILE.backup
fi
execute_python generateFesaDesign fillDesignFile $FESA_VERSION $PROJECT_NAME $WORKSPACE_PATH $FESA_XSD
execute_python generateSourceCode genCppFiles $PROJECT_NAME $WORKSPACE_PATH $SILECS_DESIGN_FILE
echo ""
echo "Please not that you need to add the dependency to the silecs library to your Makefile."
echo "Here an example: https://www-acc.gsi.de/wiki/Frontend/Silecs_1_0_0_CodeSnippets#Dependency_in_Makefile.specific !"
echo ""
echo "Code generation finished"
}
function silecs_generate_silecsdeploy {
SILECS_DEPLOY_FILE=$FILE
PROJECT_PATH=$(dirname "$(dirname "$FILE")")
WORKSPACE_PATH=$(dirname "$PROJECT_PATH")
SILECS_LIBRARY_BASE=$SILECS_BASE/silecs-communication-cpp
FESA_DEPLOY_FILE=$PROJECT_PATH/src/$PROJECT_NAME.deploy
FESA_XSD=$FESA_BASE/fesa-model-gsi/xml/deployment/deployment-gsi.xsd
FESA_GSI_TEMPLATE=$FESA_BASE/fesa-model-gsi/xml/design/templates/GSIClassTemplate.xml
SILECS_DEPLOY_VERSION="unused_parameter"
echo "generating code for $PROJECT_NAME ..."
echo ""
if [ -f $FESA_DESIGN_FILE ];
then
echo "Please note that old, obsolete xml-elements are not deleted automatically! Sometimes this can lead to an invalid FESA document!"
echo "If this is the case, please remove the obsolete elements by hand."
echo "Creating a backup of the existing FESA file at: $FESA_DEPLOY_FILE.backup"
echo ""
cp $FESA_DEPLOY_FILE $FESA_DEPLOY_FILE.backup
fi
execute_python genparam genParam $WORKSPACE_PATH $PROJECT_NAME $SILECS_DEPLOY_VERSION $SILECS_VERSION
execute_python genplcsrc genPlcSrc $WORKSPACE_PATH $PROJECT_NAME $SILECS_VERSION
execute_python genduwrapper genDuWrapper $WORKSPACE_PATH $PROJECT_NAME $SILECS_DEPLOY_VERSION
execute_python fillFESADeployUnit fillDeployUnit $WORKSPACE_PATH $PROJECT_NAME $FESA_XSD $FESA_VERSION
echo ""
echo "Please not that you need to add the dependency to the silecs library to your Makefile."
echo "Here an example: https://www-acc.gsi.de/wiki/Frontend/Silecs_1_0_0_CodeSnippets#Dependency_in_Makefile.specific !"
echo ""
echo "Code generation finished"
}
function silecs_create_design {
NEWFILEPATH=$1
DATE=$(date +%x)
SCHEMA_PATH=$SILECS_BASE/silecs-model/xml/DesignSchema.xsd
DESIGN_TEMPLATE='<?xml version="1.0" encoding="UTF-8"?>
<SILECS-Design silecs-version="'$SILECS_VERSION'" created="'$DATE'" updated="'$DATE'"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="'$SCHEMA_PATH'">
<Information>
<Owner user-login="'$USER'"/>
<Editor user-login="'$USER'"/>
</Information>
<SILECS-Class name="'$PROJECT_NAME'" version="0.1.0" domain="OPERATIONAL" >
<Acquisition-Block name="MyBlock" generateFesaProperty="true">
<Acquisition-Register name="myRegister" generateFesaValueItem="true">
<scalar format="int32"/>
</Acquisition-Register>
</Acquisition-Block>
</SILECS-Class>
</SILECS-Design>'
if [ -f $NEWFILEPATH ]; then
echo "Error: There is already a .silecsdesign file available: $NEWFILEPATH"
exit 1
fi
echo $DESIGN_TEMPLATE | xmllint --format - > $NEWFILEPATH
echo ""
echo "created new silecsdesign: $NEW_FILE"
}
function silecs_create_deploy {
NEWFILEPATH=$1
DATE=$(date +%x)
SCHEMA_PATH=$SILECS_BASE/silecs-model/xml/DeploySchema.xsd
DEPLOY_TEMPLATE='<?xml version="1.0" encoding="UTF-8"?>
<SILECS-Deploy silecs-version="'$SILECS_VERSION'" created="'$DATE'" updated="'$DATE'"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="'$SCHEMA_PATH'">
<Information>
<Owner user-login="'$USER'"/>
<Editor user-login="'$USER'"/>
</Information>
<Deploy-Unit name="'$PROJECT_NAME'" version="0.1.0"/>
<SilecsDesign silecs-design-name="" silecs-design-version=""/>
<Controller host-name="">
<Siemens-PLC system="TIA-PORTAL" model="SIMATIC_S7-300" protocol="DEVICE_MODE" base-DB-number="1">
<Device silecs-device-label="dev0" silecs-design-ref="" fesa-device-name="" fesa-fec-name=""/>
</Siemens-PLC>
</Controller>
</SILECS-Deploy>'
if [ -f $NEWFILEPATH ]; then
echo "Error: There is already a .silecsdeploy file available: $NEWFILEPATH"
exit 1
fi
echo $DEPLOY_TEMPLATE | xmllint --format - > $NEWFILEPATH
echo ""
echo "created new silecsdeploy: $NEW_FILE"
}
function silecs_create {
assert_n_arguments 2
# Resolve possible relative path
FILE=$(realpath "$FILE" )
EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
FILE_PATH=$(dirname "$FILE")
case $EXTENSION in
design)
NEW_FILE=$FILE_PATH/$PROJECT_NAME.silecsdesign
silecs_create_design $NEW_FILE
;;
deploy)
NEW_FILE=$FILE_PATH/$PROJECT_NAME.silecsdeploy
silecs_create_deploy $NEW_FILE
;;
*)
echo "Error: Passed FESA file needs to have the extension '.design' or '.deploy'"
exit 1
;;
esac
}
function silecs_open_diag {
assert_n_arguments 2
# Resolve possible relative path
FILE=$(realpath "$FILE" )
EXTENSION=$(echo "$FILE" | sed 's/^.*\.//')
if [ $EXTENSION -ne "silecsdeploy" ]; then
echo "Error: diag tool only can be opened for a -silecsdeploy file"
fi
SILECS_DIAG_TOOL=$SILECS_BASE/silecs-diagnostic-cpp/bin/x86_64/silecs-diagnostic
$SILECS_DIAG_TOOL -d $FILE
}
function silecs_release_param {
# TODO - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/5
echo "Not implemented yet .. please copy the param file by hand for now"
}
function silecs_migrate {
# TODO - See here for details: https://gitlab.com/al.schwinn/silecs-cli/-/issues/7
echo "Not implemented yet .. please update/migrate by hand for now"
}
while getopts c:v:g:d:r:m:h flag
do
case "${flag}" in
c ) silecs_create;;
v ) silecs_validate;;
g ) silecs_generate;;
d ) silecs_open_diag;;
r ) silecs_release_param;;
m ) silecs_migrate;;
h ) help;;
esac
done
......@@ -2,7 +2,7 @@
<SILECS-Deploy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
silecs-version="2.3.0" created="08/16/2022" updated="08/16/2022"
xsi:noNamespaceSchemaLocation="/common/usr/cscofe/silecs/2.3.0/silecs-model/xml/DeploySchema.xsd">
xsi:noNamespaceSchemaLocation="../silecs-model/src/xml/DeploySchema.xsd">
<Information>
<Owner user-login="mnabywan" />
<Editor user-login="mnabywan" />
......@@ -11,11 +11,11 @@
<SilecsDesign silecs-design-name="SilecsTestClass"
silecs-design-version="0.1.0" />
<Controller host-name="tsts7001">
<Siemens-PLC system="TIA-PORTAL" model="SIMATIC_S7-1500"
protocol="DEVICE_MODE" base-DB-number="1">
<Schneider-PLC system="UNITY Pro" model="M340"
protocol="BLOCK_MODE" base-address="1">
<Device silecs-device-label="dev0"
silecs-design-ref="SilecsTestClass" fesa-device-name="mySilecsTest"
fesa-fec-name="asl751"></Device>
</Siemens-PLC>
</Schneider-PLC>
</Controller>
</SILECS-Deploy>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<SILECS-Design silecs-version="2.3.0" created="08/22/2022" updated="08/22/2022"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../silecs-model/src/xml/DesignSchema.xsd">
<Information>
<Owner user-login="localadmin_mnabywan"/>
<Editor user-login="localadmin_mnabywan"/>
</Information>
<SILECS-Class name="SilecsTestDesign" version="0.1.0" domain="OPERATIONAL" >
<Acquisition-Block name="MyBlock" generateFesaProperty="true">
<Acquisition-Register name="myRegister" generateFesaValueItem="true">
<scalar format="int32"/>
</Acquisition-Register>
</Acquisition-Block>
</SILECS-Class>
</SILECS-Design>
\ No newline at end of file
......@@ -2,7 +2,7 @@
<SILECS-Deploy
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
silecs-version="2.3.0" created="08/16/2022" updated="08/16/2022"
xsi:noNamespaceSchemaLocation="/common/usr/cscofe/silecs/2.3.0/silecs-model/xml/DeploySchema.xsd">
xsi:noNamespaceSchemaLocation="../silecs-model/src/xml/DeploySchema.xsd">
<Information>
<Owner user-login="mnabywan" />
<Editor user-login="mnabywan" />
......@@ -16,6 +16,7 @@
<Device silecs-device-label="dev0"
silecs-design-ref="SilecsTestClass" fesa-device-name="mySilecsTest"
fesa-fec-name="asl751"></Device>
</Siemens-PLCerror>
</Siemens-PLC>
<unknown>test123</unknown>
</Controller>
</SILECS-Deploy>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?><deploy-unit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:/opt/fesa/fesa-model-gsi/7.4.0/xml/deployment/deployment-gsi.xsd">
<information>
<deploy-unit-name>SilecsTestClass2_DU</deploy-unit-name>
<deploy-unit-major-version>0</deploy-unit-major-version>
<deploy-unit-minor-version>1</deploy-unit-minor-version>
<deploy-unit-tiny-version>0</deploy-unit-tiny-version>
<description>Empty Template description</description>
<fesa-version>7.4.0</fesa-version>
</information>
<ownership>
<responsible name="Undefined"/>
<creator login="mnabywan"/>
</ownership>
<class>
<class-name>class-name</class-name>
<class-major-version>0</class-major-version>
<class-minor-version>1</class-minor-version>
<class-tiny-version>0</class-tiny-version>
<device-instance>required</device-instance>
</class>
<executable>
<server extension="_S"/>
</executable>
</deploy-unit>
......@@ -16,24 +16,24 @@
<interface>
<device-interface>
<setting>
<GSI-Init-Property multiplexed="false" name="Init" visibility="operational" id="_220816101616_0">
<GSI-Init-Property multiplexed="false" name="Init" visibility="operational" id="_220830102016_0">
<description>Control property, used to initialize the device with default values from the device instantiation file</description>
<set-action partial-setting="true" transaction="true">
<server-action-ref server-action-name-ref="InitSetAction"/>
</set-action>
</GSI-Init-Property>
<GSI-Reset-Property multiplexed="false" name="Reset" visibility="operational" id="_220816101616_1">
<GSI-Reset-Property multiplexed="false" name="Reset" visibility="operational" id="_220830102016_1">
<description>Control property, used to reset the device while keeping the persistent data.</description>
<set-action partial-setting="true" transaction="true">
<server-action-ref server-action-name-ref="ResetSetAction"/>
</set-action>
</GSI-Reset-Property>
<GSI-Setting-Property multiplexed="false" name="Setting" visibility="operational" id="_220816101617_0">
<GSI-Setting-Property multiplexed="false" name="Setting" visibility="operational" id="_220830102016_2">
<description>Used for setting hardware parameters for controlling the device.</description>
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816101620_2">
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102018_0">
<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
</update-flag-item>
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816101620_3">
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102018_1">
<array type="char">
<dim>32</dim>
</array>
......@@ -45,12 +45,12 @@
<server-action-ref server-action-name-ref="SettingGetAction"/>
</get-action>
</GSI-Setting-Property>
<GSI-Setting-Property name="MySetting" visibility="development" multiplexed="false" id="_220816115050_0"><value-item name="DQ_Anlog00" direction="INOUT" id="_220817081951_0"><scalar type="int32_t"/><data-field-ref field-name-ref="DQ_Anlog00"/></value-item><value-item name="DQ_Bool07" direction="INOUT" id="_220817081951_1"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool07"/></value-item><value-item name="DQ_Bool06" direction="INOUT" id="_220817081951_2"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool06"/></value-item><value-item name="DQ_Bool05" direction="INOUT" id="_220817081952_0"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool05"/></value-item><value-item name="DQ_Bool04" direction="INOUT" id="_220817081952_1"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool04"/></value-item><value-item name="DQ_Bool03" direction="INOUT" id="_220817081952_2"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool03"/></value-item><value-item name="DQ_Bool02" direction="INOUT" id="_220817081952_3"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool02"/></value-item><value-item name="DQ_Bool01" direction="INOUT" id="_220817081952_4"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool01"/></value-item><value-item name="DQ_Bool00" direction="INOUT" id="_220817081953_0"><scalar type="int16_t"/><data-field-ref field-name-ref="DQ_Bool00"/></value-item><value-item name="mySettingRegister" direction="INOUT" id="_220816115051_1"><scalar type="int32_t"/><data-field-ref field-name-ref="mySettingRegister"/></value-item><update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816115051_2"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816115052_0"><array type="char"><dim>32</dim></array></cycle-name-item><set-action><server-action-ref server-action-name-ref="SetMySetting"/></set-action><get-action><server-action-ref server-action-name-ref="GetMySetting"/></get-action></GSI-Setting-Property><GSI-Power-Property multiplexed="false" name="Power" visibility="operational" id="_220816101617_1">
<GSI-Setting-Property name="MySetting" visibility="development" multiplexed="false" id="_220830102016_3"><value-item name="mySettingRegister" direction="INOUT" id="_220830102018_2"><scalar type="int32_t"/><data-field-ref field-name-ref="mySettingRegister"/></value-item><update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102018_3"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102018_4"><array type="char"><dim>32</dim></array></cycle-name-item><set-action><server-action-ref server-action-name-ref="SetMySetting"/></set-action><get-action><server-action-ref server-action-name-ref="GetMySetting"/></get-action></GSI-Setting-Property><GSI-Power-Property multiplexed="false" name="Power" visibility="operational" id="_220830102016_4">
<description>Used to turn the power of a device on or off.</description>
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816101621_0">
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102018_5">
<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
</update-flag-item>
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816101621_1">
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102019_0">
<array type="char">
<dim>32</dim>
</array>
......@@ -61,7 +61,7 @@
<get-action>
<server-action-ref server-action-name-ref="PowerGetAction"/>
</get-action>
<power-item direction="INOUT" name="power" id="_220816101621_2">
<power-item direction="INOUT" name="power" id="_220830102019_1">
<custom-type-scalar data-type-name-ref="DEVICE_POWER"/>
<data-field-ref field-name-ref="power"/>
......@@ -69,32 +69,32 @@
</GSI-Power-Property>
</setting>
<acquisition>
<GSI-Status-Property cycle-bound="false" name="Status" on-change="true" subscribable="true" visibility="operational" id="_220816101618_0">
<GSI-Status-Property cycle-bound="false" name="Status" on-change="true" subscribable="true" visibility="operational" id="_220830102016_5">
<description>Used to display the (cycle independent) overall status of the device.</description>
<description>Detailed status information may be additionally added to this property.</description>
<acq-stamp-item direction="OUT" name="acqStamp" id="_220816101622_0">
<acq-stamp-item direction="OUT" name="acqStamp" id="_220830102019_2">
<scalar type="int64_t"/>
</acq-stamp-item>
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816101622_1">
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102019_3">
<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
</update-flag-item>
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816101622_2">
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102019_4">
<array type="char">
<dim>32</dim>
</array>
</cycle-name-item>
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220816101622_3">
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220830102020_0">
<scalar type="int64_t"/>
</cycle-stamp-item>
<get-action>
<server-action-ref server-action-name-ref="StatusGetAction"/>
</get-action>
<status-item direction="OUT" name="status" id="_220816101623_0">
<status-item direction="OUT" name="status" id="_220830102020_1">
<custom-type-scalar data-type-name-ref="DEVICE_STATUS"/>
<data-field-ref field-name-ref="status"/>
</status-item>
<detailed-status-item direction="OUT" name="detailedStatus" id="_220816101623_1">
<detailed-status-item direction="OUT" name="detailedStatus" id="_220830102021_0">
<description>Detailed status should consist of an array of boolean values considered as detailed status information as well as a
corresponding string array containing keys to illustrate the meaning of the detailed status information.</description>
<array type="bool">
......@@ -102,7 +102,7 @@ corresponding string array containing keys to illustrate the meaning of the deta
</array>
<data-field-ref field-name-ref="detailedStatus"/>
</detailed-status-item>
<detailed-status-labels-item direction="OUT" name="detailedStatus_labels" id="_220816101623_2">
<detailed-status-labels-item direction="OUT" name="detailedStatus_labels" id="_220830102021_1">
<description>Labels of detailed status bits.</description>
<array2D type="char">
<custom-constant-dim1 constant-name-ref="DETAILED_STATUS_SIZE"/>
......@@ -110,39 +110,39 @@ corresponding string array containing keys to illustrate the meaning of the deta
</array2D>
<data-field-ref field-name-ref="detailedStatus_labels"/>
</detailed-status-labels-item>
<detailed-status-severity-item direction="OUT" name="detailedStatus_severity" id="_220816101624_0">
<detailed-status-severity-item direction="OUT" name="detailedStatus_severity" id="_220830102021_2">
<description>Severities of the detailed status bits</description>
<custom-type-array data-type-name-ref="DETAILED_STATUS_SEVERITY">
<custom-constant-dim constant-name-ref="DETAILED_STATUS_SIZE"/>
</custom-type-array>
<data-field-ref field-name-ref="detailedStatus_severity"/>
</detailed-status-severity-item>
<powerState-item direction="OUT" name="powerState" id="_220816101624_1">
<powerState-item direction="OUT" name="powerState" id="_220830102022_0">
<description>Power state of the device (ON, OFF)</description>
<custom-type-scalar data-type-name-ref="DEVICE_POWER_STATE"/>
<data-field-ref field-name-ref="powerState"/>
</powerState-item>
<control-item direction="OUT" name="control" id="_220816101624_2">
<control-item direction="OUT" name="control" id="_220830102022_1">
<custom-type-scalar data-type-name-ref="DEVICE_CONTROL"/>
<data-field-ref field-name-ref="control"/>
</control-item>
<interlock-item direction="OUT" name="interlock" id="_220816101624_3">
<interlock-item direction="OUT" name="interlock" id="_220830102022_2">
<description>Interlock state of the device</description>
<scalar type="bool"/>
<data-field-ref field-name-ref="interlock"/>
</interlock-item>
<opReady-item direction="OUT" name="opReady" id="_220816101625_0">
<opReady-item direction="OUT" name="opReady" id="_220830102022_3">
<description>Contains the devices state regarding operation</description>
<scalar type="bool"/>
<data-field-ref field-name-ref="opReady"/>
</opReady-item>
<modulesReady-item direction="OUT" name="modulesReady" id="_220816101625_1">
<modulesReady-item direction="OUT" name="modulesReady" id="_220830102022_4">
<description>Contains the devices module state</description>
<scalar type="bool"/>
<data-field-ref field-name-ref="modulesReady"/>
</modulesReady-item>
<error_collection-item direction="OUT" id="_220816101625_2">
<error_collection-item direction="OUT" id="_220830102022_5">
<error_codes direction="OUT" name="error_codes">
<array type="int32_t">
<custom-constant-dim constant-name-ref="MAX_NUMBER_OF_ERROR_MESSAGES"/>
......@@ -168,32 +168,32 @@ corresponding string array containing keys to illustrate the meaning of the deta
<error_collection-field-ref field-name-ref="error_collection"/>
</error_collection-item>
</GSI-Status-Property>
<GSI-ModuleStatus-Property cycle-bound="false" name="ModuleStatus" subscribable="true" visibility="operational" id="_220816101619_0">
<GSI-ModuleStatus-Property cycle-bound="false" name="ModuleStatus" subscribable="true" visibility="operational" id="_220830102017_0">
<description>Gives detailed information on the state of 3rd party hardware and software components which are required to operate the device.</description>
<acq-stamp-item direction="OUT" name="acqStamp" id="_220816101625_3">
<acq-stamp-item direction="OUT" name="acqStamp" id="_220830102023_0">
<scalar type="int64_t"/>
</acq-stamp-item>
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816101626_0">
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102023_1">
<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
</update-flag-item>
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816101626_1">
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102023_2">
<array type="char">
<dim>32</dim>
</array>
</cycle-name-item>
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220816101626_2">
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220830102023_3">
<scalar type="int64_t"/>
</cycle-stamp-item>
<get-action>
<server-action-ref server-action-name-ref="ModuleStatusGetAction"/>
</get-action>
<module-status-item direction="OUT" name="moduleStatus" id="_220816101627_0">
<module-status-item direction="OUT" name="moduleStatus" id="_220830102023_4">
<custom-type-array data-type-name-ref="MODULE_STATUS">
<custom-constant-dim constant-name-ref="MODULE_STATUS_SIZE"/>
</custom-type-array>
<data-field-ref field-name-ref="moduleStatus"/>
</module-status-item>
<module-status-labels-item direction="OUT" name="moduleStatus_labels" id="_220816101628_0">
<module-status-labels-item direction="OUT" name="moduleStatus_labels" id="_220830102025_0">
<array2D type="char">
<custom-constant-dim1 constant-name-ref="MODULE_STATUS_SIZE"/>
<custom-constant-dim2 constant-name-ref="MAX_MODULE_STATUS_LABEL_LENGTH"/>
......@@ -201,26 +201,26 @@ corresponding string array containing keys to illustrate the meaning of the deta
<data-field-ref field-name-ref="moduleStatus_labels"/>
</module-status-labels-item>
</GSI-ModuleStatus-Property>
<GSI-Acquisition-Property cycle-bound="true" name="Acquisition" on-change="true" subscribable="true" visibility="operational" id="_220816101619_1">
<GSI-Acquisition-Property cycle-bound="true" name="Acquisition" on-change="true" subscribable="true" visibility="operational" id="_220830102017_1">
<description>Used for returning acquisition data which is retrieved from the hardware.</description>
<acq-stamp-item direction="OUT" name="acqStamp" id="_220816101630_0">
<acq-stamp-item direction="OUT" name="acqStamp" id="_220830102026_0">
<scalar type="int64_t"/>
</acq-stamp-item>
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816101630_1">
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102026_1">
<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
</update-flag-item>
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816101630_2">
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102026_2">
<array type="char">
<dim>32</dim>
</array>
</cycle-name-item>
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220816101631_0">
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220830102026_3">
<scalar type="int64_t"/>
</cycle-stamp-item>
<get-action>
<server-action-ref server-action-name-ref="AcquisitionGetAction"/>
</get-action>
<acquisition-context-item direction="OUT" id="_220816101631_1">
<acquisition-context-item direction="OUT" id="_220830102027_0">
<processIndex direction="OUT" name="processIndex">
<scalar type="int32_t"/>
</processIndex>
......@@ -254,36 +254,36 @@ corresponding string array containing keys to illustrate the meaning of the deta
<acquisition-context-field-ref field-name-ref="acquisitionContext"/>
</acquisition-context-item>
</GSI-Acquisition-Property>
<GSI-Acquisition-Property name="MyBlock" visibility="development" subscribable="true" cycle-bound="false" on-change="true" id="_220816115051_0"><value-item name="DI_Anlog01" direction="OUT" id="_220817081953_1"><scalar type="int32_t"/><data-field-ref field-name-ref="DI_Anlog01"/></value-item><value-item name="DI_Anlog00" direction="OUT" id="_220817081953_2"><scalar type="int32_t"/><data-field-ref field-name-ref="DI_Anlog00"/></value-item><value-item name="DI_Bool07" direction="OUT" id="_220817081953_3"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool07"/></value-item><value-item name="DI_Bool06" direction="OUT" id="_220817081953_4"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool06"/></value-item><value-item name="DI_Bool05" direction="OUT" id="_220817081953_5"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool05"/></value-item><value-item name="DI_Bool04" direction="OUT" id="_220817081954_0"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool04"/></value-item><value-item name="DI_Bool03" direction="OUT" id="_220817081954_1"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool03"/></value-item><value-item name="DI_Bool02" direction="OUT" id="_220817081954_2"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool02"/></value-item><value-item name="DI_Bool01" direction="OUT" id="_220817081954_3"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool01"/></value-item><value-item name="DI_Bool00" direction="OUT" id="_220817081954_4"><scalar type="int16_t"/><data-field-ref field-name-ref="DI_Bool00"/></value-item><value-item name="myRegister" direction="OUT" id="_220816115052_1"><scalar type="int32_t"/><data-field-ref field-name-ref="myRegister"/></value-item><acq-stamp-item direction="OUT" name="acqStamp" id="_220816115052_2"><scalar type="int64_t"/></acq-stamp-item><update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816115052_3"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816115053_0"><array type="char"><dim>32</dim></array></cycle-name-item><cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220816115053_1"><scalar type="int64_t"/></cycle-stamp-item><get-action><server-action-ref server-action-name-ref="GetMyBlock"/></get-action><acquisition-context-item direction="OUT" id="_220816115053_2"><processIndex direction="OUT" name="processIndex"><scalar type="int32_t"/></processIndex><sequenceIndex direction="OUT" name="sequenceIndex"><scalar type="int32_t"/></sequenceIndex><chainIndex direction="OUT" name="chainIndex"><scalar type="int32_t"/></chainIndex><eventNumber direction="OUT" name="eventNumber"><scalar type="int32_t"/></eventNumber><timingGroupID direction="OUT" name="timingGroupID"><scalar type="int32_t"/></timingGroupID><acquisitionStamp direction="OUT" name="acquisitionStamp"><scalar type="int64_t"/></acquisitionStamp><eventStamp direction="OUT" name="eventStamp"><scalar type="int64_t"/></eventStamp><processStartStamp direction="OUT" name="processStartStamp"><scalar type="int64_t"/></processStartStamp><sequenceStartStamp direction="OUT" name="sequenceStartStamp"><scalar type="int64_t"/></sequenceStartStamp><chainStartStamp direction="OUT" name="chainStartStamp"><scalar type="int64_t"/></chainStartStamp><acquisition-context-field-ref field-name-ref="acquisitionContext"/></acquisition-context-item></GSI-Acquisition-Property><GSI-Version-Property cycle-bound="false" name="Version" on-change="false" subscribable="false" visibility="operational" id="_220816101619_2">
<GSI-Acquisition-Property name="MyBlock" visibility="development" subscribable="true" cycle-bound="false" on-change="true" id="_220830102017_2"><value-item name="myRegister" direction="OUT" id="_220830102027_1"><scalar type="int32_t"/><data-field-ref field-name-ref="myRegister"/></value-item><acq-stamp-item direction="OUT" name="acqStamp" id="_220830102028_0"><scalar type="int64_t"/></acq-stamp-item><update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102028_1"><builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/></update-flag-item><cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102029_0"><array type="char"><dim>32</dim></array></cycle-name-item><cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220830102029_1"><scalar type="int64_t"/></cycle-stamp-item><get-action><server-action-ref server-action-name-ref="GetMyBlock"/></get-action><acquisition-context-item direction="OUT" id="_220830102029_2"><processIndex direction="OUT" name="processIndex"><scalar type="int32_t"/></processIndex><sequenceIndex direction="OUT" name="sequenceIndex"><scalar type="int32_t"/></sequenceIndex><chainIndex direction="OUT" name="chainIndex"><scalar type="int32_t"/></chainIndex><eventNumber direction="OUT" name="eventNumber"><scalar type="int32_t"/></eventNumber><timingGroupID direction="OUT" name="timingGroupID"><scalar type="int32_t"/></timingGroupID><acquisitionStamp direction="OUT" name="acquisitionStamp"><scalar type="int64_t"/></acquisitionStamp><eventStamp direction="OUT" name="eventStamp"><scalar type="int64_t"/></eventStamp><processStartStamp direction="OUT" name="processStartStamp"><scalar type="int64_t"/></processStartStamp><sequenceStartStamp direction="OUT" name="sequenceStartStamp"><scalar type="int64_t"/></sequenceStartStamp><chainStartStamp direction="OUT" name="chainStartStamp"><scalar type="int64_t"/></chainStartStamp><acquisition-context-field-ref field-name-ref="acquisitionContext"/></acquisition-context-item></GSI-Acquisition-Property><GSI-Version-Property cycle-bound="false" name="Version" on-change="false" subscribable="false" visibility="operational" id="_220830102017_3">
<description>Returns the current software and hardware versions of a piece of equipment.</description>
<acq-stamp-item direction="OUT" name="acqStamp" id="_220816101631_2">
<acq-stamp-item direction="OUT" name="acqStamp" id="_220830102030_0">
<scalar type="int64_t"/>
</acq-stamp-item>
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220816101631_3">
<update-flag-item direction="OUT" name="updateFlags" optional="true" id="_220830102030_1">
<builtin-type-scalar data-type-name-ref="NOTIFICATION_UPDATE"/>
</update-flag-item>
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220816101631_4">
<cycle-name-item direction="OUT" name="cycleName" optional="true" id="_220830102030_2">
<array type="char">
<dim>32</dim>
</array>
</cycle-name-item>
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220816101631_5">
<cycle-stamp-item direction="OUT" name="cycleStamp" optional="true" id="_220830102030_3">
<scalar type="int64_t"/>
</cycle-stamp-item>
<get-action>
<server-action-ref server-action-name-ref="VersionGetAction"/>
</get-action>
<version-item direction="OUT" name="classVersion" id="_220816101632_0">
<version-item direction="OUT" name="classVersion" id="_220830102031_0">
<array type="char">
<custom-constant-dim constant-name-ref="MAX_VERSION_NAME_LENGTH"/>
</array>
</version-item>
<version-item direction="OUT" name="deployUnitVersion" id="_220816101632_1">
<version-item direction="OUT" name="deployUnitVersion" id="_220830102031_1">
<array type="char">
<custom-constant-dim constant-name-ref="MAX_VERSION_NAME_LENGTH"/>
</array>
</version-item>
<version-item direction="OUT" name="fesaVersion" id="_220816101632_2">
<version-item direction="OUT" name="fesaVersion" id="_220830102031_2">
<array type="char">
<custom-constant-dim constant-name-ref="MAX_VERSION_NAME_LENGTH"/>
</array>
......@@ -293,39 +293,39 @@ corresponding string array containing keys to illustrate the meaning of the deta
</device-interface>
<global-interface>
<setting>
<diagnostic-property multiplexed="false" name="DiagnosticSetting" visibility="expert" id="_220816101620_0">
<diagnostic-property multiplexed="false" name="DiagnosticSetting" visibility="expert" id="_220830102017_4">
<description>Generic property which allows to diagnose any FESA classes</description>
<mode-item direction="INOUT" name="enableDiagMode" id="_220816101632_3">
<mode-item direction="INOUT" name="enableDiagMode" id="_220830102031_3">
<scalar type="bool"/>
</mode-item>
<host-item direction="INOUT" name="hostName" id="_220816101632_4">
<host-item direction="INOUT" name="hostName" id="_220830102031_4">
<description>Host of the FESA class</description>
<array type="char">
<dim>32</dim>
</array>
</host-item>
<port-item direction="INOUT" name="portNumber" id="_220816101632_5">
<port-item direction="INOUT" name="portNumber" id="_220830102031_5">
<description>Port used by the FESA class</description>
<scalar type="int32_t"/>
</port-item>
<config-item direction="IN" name="requestConfig" id="_220816101632_6">
<config-item direction="IN" name="requestConfig" id="_220830102031_6">
<scalar type="bool"/>
</config-item>
<state-item direction="IN" name="requestState" id="_220816101633_0">
<state-item direction="IN" name="requestState" id="_220830102032_0">
<scalar type="bool"/>
</state-item>
<fwk-topic-item direction="INOUT" name="fwkTopic" id="_220816101633_1">
<fwk-topic-item direction="INOUT" name="fwkTopic" id="_220830102032_1">
<builtin-type-scalar data-type-name-ref="DIAG_FWK_TOPIC"/>
</fwk-topic-item>
<custom-topic-item direction="INOUT" name="customTopic" id="_220816101633_2">
<custom-topic-item direction="INOUT" name="customTopic" id="_220830102032_2">
<custom-type-scalar data-type-name-ref="DIAG_TOPIC"/>
</custom-topic-item>
<device-trace-item direction="INOUT" name="traceDevices" id="_220816101633_3">
<device-trace-item direction="INOUT" name="traceDevices" id="_220830102032_3">
<array type="char">
<dim>320</dim>
</array>
</device-trace-item>
<bypass-action-item direction="INOUT" name="bypassActions" id="_220816101633_4">
<bypass-action-item direction="INOUT" name="bypassActions" id="_220830102032_4">
<array type="char">
<dim>320</dim>
</array>
......@@ -333,31 +333,31 @@ corresponding string array containing keys to illustrate the meaning of the deta
</diagnostic-property>
</setting>
<acquisition>
<GSI-DeviceDescription-Property cycle-bound="false" name="DeviceDescription" on-change="false" subscribable="false" visibility="operational" id="_220816101620_1">
<timing-info-item direction="OUT" name="deviceNameTimingReceiver" id="_220816101633_5">
<GSI-DeviceDescription-Property cycle-bound="false" name="DeviceDescription" on-change="false" subscribable="false" visibility="operational" id="_220830102017_5">
<timing-info-item direction="OUT" name="deviceNameTimingReceiver" id="_220830102032_5">
<array type="char">
<variable-dim/>
</array>
<data-field-ref field-name-ref="deviceNameTimingReceiver"/>
</timing-info-item>
<property-info-item direction="OUT" name="propertyNames" id="_220816101633_6">
<property-info-item direction="OUT" name="propertyNames" id="_220830102033_0">
<array2D type="char">
<variable-dim1/>
<variable-dim2/>
</array2D>
</property-info-item>
<device-info-item direction="OUT" name="deviceNames" id="_220816101634_0">
<device-info-item direction="OUT" name="deviceNames" id="_220830102033_1">
<array2D type="char">
<variable-dim1/>
<variable-dim2/>
</array2D>
</device-info-item>
<global-device-info-item direction="OUT" name="globalDeviceName" id="_220816101634_1">
<global-device-info-item direction="OUT" name="globalDeviceName" id="_220830102033_2">
<array type="char">
<variable-dim/>
</array>
</global-device-info-item>
<host-info-item direction="OUT" name="host" id="_220816101634_2">
<host-info-item direction="OUT" name="host" id="_220830102033_3">
<array type="char">
<variable-dim/>
</array>
......@@ -398,81 +398,81 @@ corresponding string array containing keys to illustrate the meaning of the deta
</builtin-types>
<custom-types>
<diag-custom-topic name="DIAG_TOPIC" id="_220816101644_0">
<diag-custom-topic name="DIAG_TOPIC" id="_220830102046_1">
</diag-custom-topic>
<enum name="DEVICE_STATUS" id="_220816101644_1">
<enum name="DEVICE_STATUS" id="_220830102047_0">
<!--Possible (mutually exclusive) values to describe the device status-->
<item access="RW" meaning="NONE" symbol="UNKNOWN" value="0" id="_220816101650_4"/>
<item access="RW" meaning="NONE" symbol="UNKNOWN" value="0" id="_220830102055_0"/>
<!--The device status is unknown-->
<item access="RW" meaning="NONE" symbol="OK" value="1" id="_220816101651_0"/>
<item access="RW" meaning="NONE" symbol="OK" value="1" id="_220830102055_1"/>
<!--The device is in fully operational state-->
<item access="RW" meaning="NONE" symbol="WARNING" value="2" id="_220816101651_1"/>
<item access="RW" meaning="NONE" symbol="WARNING" value="2" id="_220830102055_2"/>
<!--The device is not fully operational; A device in WARNING state can still be used operationally, -->
<!--but clients must be informed of a problem that might become worse. Details are explained in the errorMsg field.-->
<item access="RW" meaning="NONE" symbol="ERROR" value="3" id="_220816101651_2"/>
<item access="RW" meaning="NONE" symbol="ERROR" value="3" id="_220830102056_0"/>
<!--The device is in a fault state. Details are explained in the errorMsg field-->
</enum>
<enum name="DEVICE_POWER_STATE" id="_220816101645_0">
<enum name="DEVICE_POWER_STATE" id="_220830102047_1">
<!--Possible (mutually exclusive) values to describe the power-state of the device.-->
<item access="RW" meaning="NONE" symbol="UNKNOWN" value="0" id="_220816101651_3"/>
<item access="RW" meaning="NONE" symbol="UNKNOWN" value="0" id="_220830102056_1"/>
<!--The device mode is unknown-->
<item access="RW" meaning="ON" symbol="ON" value="1" id="_220816101652_0"/>
<item access="RW" meaning="ON" symbol="ON" value="1" id="_220830102057_0"/>
<!--The device is in fully operational state-->
<item access="RW" meaning="NONE" symbol="OFF" value="2" id="_220816101652_1"/>
<item access="RW" meaning="NONE" symbol="OFF" value="2" id="_220830102057_1"/>
<!--The device is turned off-->
<item access="RW" meaning="NONE" symbol="STANDBY" value="3" id="_220816101652_2"/>
<item access="RW" meaning="NONE" symbol="STANDBY" value="3" id="_220830102058_0"/>
<!--The device is in a stand-by mode. This mode is a sort of “parking mode” in which the device can -->
<!--stay for hours or even days. It is defined by the following characteristics:-->
<!--It is safe, it does not wear out, it consumes little energy.-->
<!--Furthermore, it takes a short time to go from STANDBY to ON mode-->
<item access="RW" meaning="NONE" symbol="POWER_DOWN" value="4" id="_220816101652_3"/>
<item access="RW" meaning="NONE" symbol="POWER_DOWN" value="4" id="_220830102058_1"/>
<!--The device is shutting down. Note that some properties may not be accessible during this time.-->
<!--After shutdown the device will be in the mode OFF-->
<item access="RW" meaning="NONE" symbol="POWER_UP" value="5" id="_220816101653_0"/>
<item access="RW" meaning="NONE" symbol="POWER_UP" value="5" id="_220830102058_2"/>
<!--The device is starting up. Note that some properties may not be accessible during this time.-->
<!--After (re-)starting the device probably will be in the mode ON-->
</enum>
<enum name="DEVICE_POWER" id="_220816101645_1">
<enum name="DEVICE_POWER" id="_220830102048_0">
<!--An enumeration Type used to control the operational mode of the device.-->
<!--Its values are a subset of those in the DEVICE_POWER_STATE type-->
<item access="RW" meaning="ON" symbol="ON" value="1" id="_220816101653_1"/>
<item access="RW" meaning="ON" symbol="ON" value="1" id="_220830102059_0"/>
<!--The device is in fully operational state-->
<item access="RW" meaning="OFF" symbol="OFF" value="2" id="_220816101653_2"/>
<item access="RW" meaning="OFF" symbol="OFF" value="2" id="_220830102059_1"/>
<!--The device is turned off-->
</enum>
<enum name="DEVICE_CONTROL" id="_220816101645_2">
<enum name="DEVICE_CONTROL" id="_220830102048_1">
<!--Possible values to describe the control mode of a device-->
<!--Currently two control modes (LOCAL, REMOTE) are defined-->
<item access="RW" meaning="NONE" symbol="REMOTE" value="0" id="_220816101653_3"/>
<item access="RW" meaning="NONE" symbol="REMOTE" value="0" id="_220830102100_0"/>
<!--The device can be controlled normally through the control system-->
<item access="RW" meaning="NONE" symbol="LOCAL" value="1" id="_220816101653_4"/>
<item access="RW" meaning="NONE" symbol="LOCAL" value="1" id="_220830102100_1"/>
<!--The device can be controlled locally. But it can be accessed in read-only mode via the control system-->
</enum>
<enum name="TOL_CHECK_MODE" id="_220816101646_0">
<enum name="TOL_CHECK_MODE" id="_220830102048_2">
<!--This constant defines possible modes to check whether a control value is inside the tolerance values.-->
<!--Used to give information on how the tolerance fields are used to calculate the xxx_status information.-->
<item access="RO" symbol="ABS" value="0" id="_220816101653_5"/>
<item access="RO" symbol="ABS" value="0" id="_220830102101_0"/>
<!--Use the absolute tolerance _tolAbs-->
<item access="RO" symbol="REL" value="1" id="_220816101653_6"/>
<item access="RO" symbol="REL" value="1" id="_220830102102_0"/>
<!--Use the relative tolerance _tolRel-->
</enum>
<bit-enum-32bits name="AQN_STATUS" id="_220816101646_1">
<bit-enum-32bits name="AQN_STATUS" id="_220830102049_0">
<!--Possible values to describe the acquisition status of a field (in the _status suffix)-->
<!--If this suffix is missing, it means that no additional status information is provided for the corresponding field-->
<!--If all bits are 0, this means that the corresponding field is OK.-->
......@@ -511,117 +511,117 @@ corresponding string array containing keys to illustrate the meaning of the deta
<!--into bit 16..32 you can put in anything you want-->
</bit-enum-32bits>
<struct name="GSI_ERROR" id="_220816101646_2">
<struct name="GSI_ERROR" id="_220830102049_1">
<!--This struct-item describes the structure of an GSI-error-->
<struct-item name="error_string" id="_220816101654_7">
<struct-item name="error_string" id="_220830102106_1">
<!--This string holds the error-message-->
<array type="char">
<custom-constant-dim constant-name-ref="MAX_ERROR_MESSAGE_LENGTH"/>
</array>
</struct-item>
<struct-item name="error_code" id="_220816101654_8">
<struct-item name="error_code" id="_220830102106_2">
<!--The error code according to the defined error-message-->
<scalar type="int32_t"/>
</struct-item>
<!--The timestamp when the error occured-->
<struct-item name="error_timestamp" id="_220816101655_0">
<struct-item name="error_timestamp" id="_220830102107_0">
<scalar type="int64_t"/>
</struct-item>
<!--The cycle for which the error occured-->
<struct-item name="error_cycle_name" id="_220816101655_1">
<struct-item name="error_cycle_name" id="_220830102107_1">
<array type="char">
<custom-constant-dim constant-name-ref="MAX_CYCLE_NAME_LENGTH"/>
</array>
</struct-item>
</struct>
<struct name="GSI_ACQ_CONTEXT" id="_220816101646_3">
<struct name="GSI_ACQ_CONTEXT" id="_220830102050_0">
<description>WhiteRabbit event specific acquisition information</description>
<struct-item name="processIndex" id="_220816101655_2">
<struct-item name="processIndex" id="_220830102108_0">
<description>Used in order to index process-multiplexed data</description>
<scalar type="int32_t"/>
</struct-item>
<struct-item name="sequenceIndex" id="_220816101655_3">
<struct-item name="sequenceIndex" id="_220830102108_1">
<description>Used in order to index sequence-multiplexed data</description>
<scalar type="int32_t"/>
</struct-item>
<struct-item name="chainIndex" id="_220816101655_4">
<struct-item name="chainIndex" id="_220830102108_2">
<description>Refers to a specific beam production chain</description>
<scalar type="int32_t"/>
</struct-item>
<struct-item name="eventNumber" id="_220816101655_5">
<struct-item name="eventNumber" id="_220830102109_0">
<description>The number of the event describes it's type</description>
<scalar type="int32_t"/>
</struct-item>
<struct-item name="timingGroupID" id="_220816101655_6">
<struct-item name="timingGroupID" id="_220830102109_1">
<description>ID of the timing group for which the event is relevant</description>
<scalar type="int32_t"/>
</struct-item>
<struct-item name="acquisitionStamp" id="_220816101655_7">
<struct-item name="acquisitionStamp" id="_220830102110_0">
<description>The acquisition stamp is used to indicate when a measurement was done</description>
<scalar type="int64_t"/>
</struct-item>
<struct-item name="eventStamp" id="_220816101655_8">
<struct-item name="eventStamp" id="_220830102110_1">
<description>The event stamp is used to indicate when WhiteRabbit event was triggered on the Timing Receiver</description>
<scalar type="int64_t"/>
</struct-item>
<struct-item name="processStartStamp" id="_220816101656_0">
<struct-item name="processStartStamp" id="_220830102111_0">
<description>The process start stamp indicates when the first event of the current process was triggered</description>
<scalar type="int64_t"/>
</struct-item>
<struct-item name="sequenceStartStamp" id="_220816101656_1">
<struct-item name="sequenceStartStamp" id="_220830102111_1">
<description>The sequence start stamp indicates when the first event of the current sequence was triggered</description>
<scalar type="int64_t"/>
</struct-item>
<struct-item name="chainStartStamp" id="_220816101656_2">
<struct-item name="chainStartStamp" id="_220830102111_2">
<description>The chain start stamp indicates when the first event of the current chain was triggered</description>
<scalar type="int64_t"/>
</struct-item>
</struct>
<constant name="MAX_ERROR_MESSAGE_LENGTH" type="uint32_t" value="256" id="_220816101647_0"/>
<constant name="MAX_NUMBER_OF_ERROR_MESSAGES" type="uint32_t" value="16" id="_220816101647_1"/>
<constant name="MAX_CYCLE_NAME_LENGTH" type="uint32_t" value="256" id="_220816101647_2"/>
<constant name="MAX_VERSION_NAME_LENGTH" type="uint32_t" value="256" id="_220816101648_0"/>
<constant name="MAX_DETAILED_STATUS_LABEL_LENGTH" type="uint32_t" value="30" id="_220816101648_1"/>
<constant name="DETAILED_STATUS_SIZE" type="uint32_t" value="2" id="_220816101649_0"/>
<enum name="DETAILED_STATUS_SEVERITY" id="_220816101650_0">
<item access="RO" symbol="INFO" value="0" id="_220816101653_7"/>
<item access="RO" symbol="WARNING_ON_FALSE" value="1" id="_220816101654_0"/>
<item access="RO" symbol="ERROR_ON_FALSE" value="2" id="_220816101654_1"/>
<constant name="MAX_ERROR_MESSAGE_LENGTH" type="uint32_t" value="256" id="_220830102050_1"/>
<constant name="MAX_NUMBER_OF_ERROR_MESSAGES" type="uint32_t" value="16" id="_220830102051_0"/>
<constant name="MAX_CYCLE_NAME_LENGTH" type="uint32_t" value="256" id="_220830102051_1"/>
<constant name="MAX_VERSION_NAME_LENGTH" type="uint32_t" value="256" id="_220830102051_2"/>
<constant name="MAX_DETAILED_STATUS_LABEL_LENGTH" type="uint32_t" value="30" id="_220830102052_0"/>
<constant name="DETAILED_STATUS_SIZE" type="uint32_t" value="2" id="_220830102052_1"/>
<enum name="DETAILED_STATUS_SEVERITY" id="_220830102053_0">
<item access="RO" symbol="INFO" value="0" id="_220830102102_1"/>
<item access="RO" symbol="WARNING_ON_FALSE" value="1" id="_220830102103_0"/>
<item access="RO" symbol="ERROR_ON_FALSE" value="2" id="_220830102103_1"/>
</enum>
<enum name="MODULE_STATUS" id="_220816101650_1">
<enum name="MODULE_STATUS" id="_220830102053_1">
<!-- Mutually exclusive values to describe the status of a hardware / software module-->
<item access="RO" symbol="UNKNOWN" value="0" id="_220816101654_2"/>
<item access="RO" symbol="UNKNOWN" value="0" id="_220830102104_0"/>
<!--The status of the module is not known-->
<item access="RO" symbol="OK" value="1" id="_220816101654_3"/>
<item access="RO" symbol="OK" value="1" id="_220830102104_1"/>
<!--The module is in fully operational state-->
<item access="RO" symbol="WARNING" value="2" id="_220816101654_4"/>
<item access="RO" symbol="WARNING" value="2" id="_220830102105_0"/>
<!--The module is not fully operational; A module in WARNING state may still be used operationally, -->
<!--but clients must be informed of a problem that might become worse. -->
<item access="RO" symbol="ERROR" value="3" id="_220816101654_5"/>
<item access="RO" symbol="ERROR" value="3" id="_220830102105_1"/>
<!--The module is in a fault state. The related device is not operational.-->
<item access="RO" symbol="NOT_AVAILABLE" value="4" id="_220816101654_6"/>
<item access="RO" symbol="NOT_AVAILABLE" value="4" id="_220830102106_0"/>
<!--The module is missing. The related device is not operational.-->
</enum>
<constant name="MAX_MODULE_STATUS_LABEL_LENGTH" type="uint32_t" value="30" id="_220816101650_2"/>
<constant name="MODULE_STATUS_SIZE" type="uint32_t" value="2" id="_220816101650_3"/>
<constant name="MAX_MODULE_STATUS_LABEL_LENGTH" type="uint32_t" value="30" id="_220830102054_0"/>
<constant name="MODULE_STATUS_SIZE" type="uint32_t" value="2" id="_220830102054_1"/>
</custom-types>
<data>
<device-data>
<configuration>
<field name="plcDeviceLabel" id="_220816115053_3"><description>Name of the related SILECS instance within the PLC mapping</description><array type="char"><dim>128</dim></array></field><field name="plcHostName" id="_220816115054_0"><description>Hostname of the PLC that contains the related SILECS class device</description><array type="char"><dim>128</dim></array></field><GSI-detailed-status-labels-field name="detailedStatus_labels" id="_220816101635_0">
<field name="plcDeviceLabel" id="_220830102035_0"><description>Name of the related SILECS instance within the PLC mapping</description><array type="char"><dim>128</dim></array></field><field name="plcHostName" id="_220830102035_1"><description>Hostname of the PLC that contains the related SILECS class device</description><array type="char"><dim>128</dim></array></field><GSI-detailed-status-labels-field name="detailedStatus_labels" id="_220830102035_2">
<array2D type="char">
<custom-constant-dim1 constant-name-ref="DETAILED_STATUS_SIZE"/>
<custom-constant-dim2 constant-name-ref="MAX_DETAILED_STATUS_LABEL_LENGTH"/>
</array2D>
<default>{myStatusLabel1,myStatusLabel2}</default>
</GSI-detailed-status-labels-field>
<GSI-detailed-status-severity-field name="detailedStatus_severity" id="_220816101635_1">
<GSI-detailed-status-severity-field name="detailedStatus_severity" id="_220830102035_3">
<custom-type-array data-type-name-ref="DETAILED_STATUS_SEVERITY">
<custom-constant-dim constant-name-ref="DETAILED_STATUS_SIZE"/>
</custom-type-array>
<default>{INFO,INFO}</default>
</GSI-detailed-status-severity-field>
<GSI-module-status-labels-field name="moduleStatus_labels" id="_220816101635_2">
<GSI-module-status-labels-field name="moduleStatus_labels" id="_220830102036_0">
<array2D type="char">
<custom-constant-dim1 constant-name-ref="MODULE_STATUS_SIZE"/>
......@@ -631,43 +631,43 @@ corresponding string array containing keys to illustrate the meaning of the deta
</GSI-module-status-labels-field>
</configuration>
<setting>
<field name="DQ_Anlog00" multiplexed="false" persistent="true" id="_220817081955_0"><scalar type="int32_t"/></field><field name="DQ_Bool07" multiplexed="false" persistent="true" id="_220817081955_1"><scalar type="int16_t"/></field><field name="DQ_Bool06" multiplexed="false" persistent="true" id="_220817081955_2"><scalar type="int16_t"/></field><field name="DQ_Bool05" multiplexed="false" persistent="true" id="_220817081955_3"><scalar type="int16_t"/></field><field name="DQ_Bool04" multiplexed="false" persistent="true" id="_220817081955_4"><scalar type="int16_t"/></field><field name="DQ_Bool03" multiplexed="false" persistent="true" id="_220817081955_5"><scalar type="int16_t"/></field><field name="DQ_Bool02" multiplexed="false" persistent="true" id="_220817081955_6"><scalar type="int16_t"/></field><field name="DQ_Bool01" multiplexed="false" persistent="true" id="_220817081956_0"><scalar type="int16_t"/></field><field name="DQ_Bool00" multiplexed="false" persistent="true" id="_220817081956_1"><scalar type="int16_t"/></field><field name="mySettingRegister" multiplexed="false" persistent="true" id="_220816115054_1"><scalar type="int32_t"/></field><GSI-power-field multiplexed="false" name="power" persistent="false" id="_220816101635_3">
<field name="mySettingRegister" multiplexed="false" persistent="true" id="_220830102036_1"><scalar type="int32_t"/></field><GSI-power-field multiplexed="false" name="power" persistent="false" id="_220830102036_2">
<custom-type-scalar data-type-name-ref="DEVICE_POWER"/>
</GSI-power-field>
</setting>
<acquisition>
<field name="DI_Anlog01" cycle-bound="false" persistent="false" id="_220817081956_2"><scalar type="int32_t"/></field><field name="DI_Anlog00" cycle-bound="false" persistent="false" id="_220817081956_3"><scalar type="int32_t"/></field><field name="DI_Bool07" cycle-bound="false" persistent="false" id="_220817081956_4"><scalar type="int16_t"/></field><field name="DI_Bool06" cycle-bound="false" persistent="false" id="_220817081956_5"><scalar type="int16_t"/></field><field name="DI_Bool05" cycle-bound="false" persistent="false" id="_220817081956_6"><scalar type="int16_t"/></field><field name="DI_Bool04" cycle-bound="false" persistent="false" id="_220817081957_0"><scalar type="int16_t"/></field><field name="DI_Bool03" cycle-bound="false" persistent="false" id="_220817081957_1"><scalar type="int16_t"/></field><field name="DI_Bool02" cycle-bound="false" persistent="false" id="_220817081958_0"><scalar type="int16_t"/></field><field name="DI_Bool01" cycle-bound="false" persistent="false" id="_220817081958_1"><scalar type="int16_t"/></field><field name="DI_Bool00" cycle-bound="false" persistent="false" id="_220817081958_2"><scalar type="int16_t"/></field><field name="myRegister" cycle-bound="false" persistent="false" id="_220816115054_2"><scalar type="int32_t"/></field><GSI-control-field cycle-bound="false" name="control" id="_220816101635_4">
<field name="myRegister" cycle-bound="false" persistent="false" id="_220830102037_0"><scalar type="int32_t"/></field><GSI-control-field cycle-bound="false" name="control" id="_220830102037_1">
<custom-type-scalar data-type-name-ref="DEVICE_CONTROL"/>
</GSI-control-field>
<GSI-powerState-field cycle-bound="false" name="powerState" id="_220816101635_5">
<GSI-powerState-field cycle-bound="false" name="powerState" id="_220830102039_0">
<custom-type-scalar data-type-name-ref="DEVICE_POWER_STATE"/>
</GSI-powerState-field>
<GSI-status-field cycle-bound="false" name="status" id="_220816101636_0">
<GSI-status-field cycle-bound="false" name="status" id="_220830102041_0">
<custom-type-scalar data-type-name-ref="DEVICE_STATUS"/>
</GSI-status-field>
<GSI-interlock-field cycle-bound="false" name="interlock" id="_220816101637_0">
<GSI-interlock-field cycle-bound="false" name="interlock" id="_220830102041_1">
<scalar type="bool"/>
</GSI-interlock-field>
<GSI-opReady-field cycle-bound="false" name="opReady" id="_220816101638_0">
<GSI-opReady-field cycle-bound="false" name="opReady" id="_220830102042_0">
<scalar type="bool"/>
</GSI-opReady-field>
<GSI-modulesReady-field cycle-bound="false" name="modulesReady" id="_220816101640_0">
<GSI-modulesReady-field cycle-bound="false" name="modulesReady" id="_220830102043_0">
<scalar type="bool"/>
</GSI-modulesReady-field>
<GSI-detailed-status-field cycle-bound="false" name="detailedStatus" id="_220816101640_1">
<GSI-detailed-status-field cycle-bound="false" name="detailedStatus" id="_220830102043_1">
<array type="bool">
<custom-constant-dim constant-name-ref="DETAILED_STATUS_SIZE"/>
</array>
</GSI-detailed-status-field>
<GSI-module-status-field cycle-bound="false" name="moduleStatus" id="_220816101640_2">
<GSI-module-status-field cycle-bound="false" name="moduleStatus" id="_220830102044_0">
<custom-type-array data-type-name-ref="MODULE_STATUS">
<custom-constant-dim constant-name-ref="MODULE_STATUS_SIZE"/>
</custom-type-array>
</GSI-module-status-field>
<GSI-acquisition-context-field cycle-bound="true" name="acquisitionContext" id="_220816101641_0">
<GSI-acquisition-context-field cycle-bound="true" name="acquisitionContext" id="_220830102044_1">
<custom-type-scalar data-type-name-ref="GSI_ACQ_CONTEXT"/>
</GSI-acquisition-context-field>
<GSI-error_collection-field cycle-bound="false" name="error_collection" id="_220816101641_1">
<GSI-error_collection-field cycle-bound="false" name="error_collection" id="_220830102045_0">
<custom-type-array data-type-name-ref="GSI_ERROR">
<custom-constant-dim constant-name-ref="MAX_NUMBER_OF_ERROR_MESSAGES"/>
</custom-type-array>
......@@ -677,7 +677,7 @@ corresponding string array containing keys to illustrate the meaning of the deta
<global-data>
<configuration>
<!-- The name of the timing receiver -->
<field name="plcClassVersion" id="_220816115054_3"><description>Version of the SILECS class that needs to be deployed in the controller</description><array type="char"><dim>5</dim></array><default>0.1.0</default></field><GSI-timing-receiver-name-field name="deviceNameTimingReceiver" id="_220816101643_0">
<field name="plcClassVersion" id="_220830102045_1"><description>Version of the SILECS class that needs to be deployed in the controller</description><array type="char"><dim>5</dim></array><default>0.1.0</default></field><GSI-timing-receiver-name-field name="deviceNameTimingReceiver" id="_220830102046_0">
<array type="char">
<!-- The number of the timing receiver -->
<variable-dim/>
......@@ -702,7 +702,7 @@ corresponding string array containing keys to illustrate the meaning of the deta
<get-server-action name="GetMyBlock" implementation="custom"/><set-server-action name="SetMySetting" implementation="custom"/><get-server-action name="GetMySetting" implementation="custom"/></actions>
<events>
<logical-events>
<logical-event name="StatusUpdateEvent" type="timer" use="required" id="_220816101634_3"/>
<logical-event name="StatusUpdateEvent" type="timer" use="required" id="_220830102034_0"/>
</logical-events>
</events>
<scheduling-units>
......
<?xml version="1.0"?>
<SILECS-Param silecs-version="2.3.0">
<Mapping-Info>
<Owner user-login="mnabywan"/>
<Generation date="2022-08-30 11:14:17.910098"/>
<Deployment checksum="570584630"/>
</Mapping-Info>
<SILECS-Mapping plc-name="tsts7001" plc-brand="SIEMENS" plc-system="TIA-PORTAL" plc-model="SIMATIC_S7-1500" protocol="DEVICE_MODE" address="1" DI-address="-1" DO-address="-1" AI-address="-1" AO-address="-1" domain="" used-mem="TODO">
<SILECS-Class name="SilecsHeader" version="1.0.0" address="1" DI-address="-1" DO-address="-1" AI-address="-1" AO-address="-1" used-mem="DB1..DB1/48 bytes" used-DI="0 byte" used-DO="0 byte" used-AI="0 byte" used-AO="0 byte">
<Acquisition-Block name="hdrBlk" size="14" address="0" mem-size="48">
<Acquisition-Register name="_version" size="1" address="0" mem-size="18">
<string string-length="16" format="string"/>
</Acquisition-Register>
<Acquisition-Register name="_checksum" size="4" address="18" mem-size="4">
<scalar format="uint32"/>
</Acquisition-Register>
<Acquisition-Register name="_user" size="1" address="22" mem-size="18">
<string string-length="16" format="string"/>
</Acquisition-Register>
<Acquisition-Register name="_date" size="8" address="40" mem-size="8">
<scalar format="dt"/>
</Acquisition-Register>
</Acquisition-Block>
<Instance label="SilecsHeader" address="1" DI-address="-1" DO-address="-1" AI-address="-1" AO-address="-1"/>
</SILECS-Class>
<SILECS-Class name="SilecsTestClass" version="0.1.0" address="2" DI-address="-1" DO-address="-1" AI-address="-1" AO-address="-1" used-mem="DB2..DB2/8 bytes" used-DI="0 byte" used-DO="0 byte" used-AI="0 byte" used-AO="0 byte">
<Acquisition-Block name="MyBlock" size="4" address="0" mem-size="4">
<Acquisition-Register name="myRegister" generateFesaValueItem="true" size="4" address="0" mem-size="4">
<scalar format="int32"/>
</Acquisition-Register>
</Acquisition-Block>
<Setting-Block name="MySetting" size="4" address="4" mem-size="4">
<Setting-Register name="mySettingRegister" generateFesaValueItem="true" size="4" address="0" mem-size="4">
<scalar format="int32"/>
</Setting-Register>
</Setting-Block>
<Instance label="dev0" address="2" DI-address="-1" DO-address="-1" AI-address="-1" AO-address="-1"/>
</SILECS-Class>
</SILECS-Mapping>
</SILECS-Param>
(* ---------------------------------------------------------------------
* SilecsHeader/ v1.0.0
* BLOCK Type definition
* ---------------------------------------------------------------------
*)
TYPE _SilecsHeader_hdrBlk
AUTHOR: mnabywan
FAMILY: SILECS
NAME: UDTB
STRUCT
_version: STRING[16] := 'SILECS_2.3.0';
_checksum: DWORD := DW#16#22026e36;
_user: STRING[16] := 'mnabywan';
_date: DT := DT#2022-8-30-11:14:18;
END_STRUCT;
END_TYPE
(* ---------------------------------------------------------------------
* SilecsHeader/ v1.0.0
* BLOCK instance definition
* ---------------------------------------------------------------------
*)
DATA_BLOCK SilecsHeader_SilecsHeader
{ S7_Optimized_Access := 'FALSE' }
AUTHOR: mnabywan
FAMILY: SILECS
NAME: DEV_MODE
STRUCT
hdrBlk: _SilecsHeader_hdrBlk;
END_STRUCT;
BEGIN
END_DATA_BLOCK
(* ---------------------------------------------------------------------
* SilecsTestClass/ v0.1.0
* BLOCK Type definition
* ---------------------------------------------------------------------
*)
TYPE _SilecsTestClass_MyBlock
AUTHOR: mnabywan
FAMILY: SILECS
NAME: UDTB
STRUCT
myRegister: DINT;
END_STRUCT;
END_TYPE
TYPE _SilecsTestClass_MySetting
AUTHOR: mnabywan
FAMILY: SILECS
NAME: UDTB
STRUCT
mySettingRegister: DINT;
END_STRUCT;
END_TYPE
(* ---------------------------------------------------------------------
* SilecsTestClass/ v0.1.0
* BLOCK instance definition
* ---------------------------------------------------------------------
*)
DATA_BLOCK SilecsTestClass_dev0
{ S7_Optimized_Access := 'FALSE' }
AUTHOR: mnabywan
FAMILY: SILECS
NAME: DEV_MODE
STRUCT
MyBlock: _SilecsTestClass_MyBlock;
MySetting: _SilecsTestClass_MySetting;
END_STRUCT;
BEGIN
END_DATA_BLOCK
"_SilecsHeader_hdrBlk","UDT 1","UDT 1","[SilecsHeader/1.0.0] UDT symbol: _<class-name>_<block-name>"
"SilecsHeader_SilecsHeader","DB 1","DB 1","[SilecsHeader/1.0.0] DB symbol: <class-name>_<device-label | device-id>"
"_SilecsTestClass_MyBlock","UDT 2","UDT 2","[SilecsTestClass/0.1.0] UDT symbol: _<class-name>_<block-name>"
"_SilecsTestClass_MySetting","UDT 3","UDT 3",""
"SilecsTestClass_dev0","DB 2","DB 2","[SilecsTestClass/0.1.0] DB symbol: <class-name>_<device-label | device-id>"
/* Copyright CERN 2015
*
* WARNING: This code is automatically generated from your SILECS deploy unit document.
* You should never modify the content of this file as it would break consistency.
* Furthermore, any changes will be overwritten in the next code generation.
* Any modification shall be done using the SILECS development environment
* and regenerating this source code.
*/
#ifndef SILECSHEADER_H_
#define SILECSHEADER_H_
#include <silecs-communication/wrapper/Block.h>
#include <silecs-communication/wrapper/DeployUnit.h>
#include <silecs-communication/wrapper/Design.h>
#include <silecs-communication/wrapper/Device.h>
namespace SilecsHeader
{
class Design : public SilecsWrapper::Design
{
public:
Design(SilecsWrapper::DeployUnit *deployUnit) :
SilecsWrapper::Design("SilecsHeader", "1.0.0", deployUnit)
{
}
~Design()
{
}
};
} /* namespace SilecsHeader */
#endif /* SILECSHEADER_H_ */
/* Copyright CERN 2015
*
* WARNING: This code is automatically generated from your SILECS deploy unit document.
* You should never modify the content of this file as it would break consistency.
* Furthermore, any changes will be overwritten in the next code generation.
* Any modification shall be done using the SILECS development environment
* and regenerating this source code.
*/
#ifndef SILECSTESTCLASS_H_
#define SILECSTESTCLASS_H_
#include <silecs-communication/wrapper/Block.h>
#include <silecs-communication/wrapper/DeployUnit.h>
#include <silecs-communication/wrapper/Design.h>
#include <silecs-communication/wrapper/Device.h>
namespace SilecsTestClass
{
class Design : public SilecsWrapper::Design
{
public:
Design(SilecsWrapper::DeployUnit *deployUnit) :
SilecsWrapper::Design("SilecsTestClass", "0.1.0", deployUnit)
{
}
~Design()
{
}
};
} /* namespace SilecsTestClass */
#endif /* SILECSTESTCLASS_H_ */
/* Copyright CERN 2015
*
* WARNING: This code is automatically generated from your SILECS deploy unit document.
* You should never modify the content of this file as it would break consistency.
* Furthermore, any changes will be overwritten in the next code generation.
* Any modification shall be done using the SILECS development environment
* and regenerating this source code.
*/
#ifndef SILECSTESTCLASS_DU_H_
#define SILECSTESTCLASS_DU_H_
#include <silecs-communication/interface/equipment/SilecsCluster.h>
#include <silecs-communication/wrapper/DeployUnit.h>
#include <silecs-communication/wrapper/Design.h>
#include "SilecsHeader.h"
#include "SilecsTestClass.h"
namespace SilecsTestClass_DU
{
typedef SilecsWrapper::DeployConfig DeployConfig;
typedef SilecsWrapper::DesignConfig DesignConfig;
class DeployUnit : public SilecsWrapper::DeployUnit
{
public:
/*!
* \brief Use this method to create/get the unique instance of the Deploy Unit.
*
* \param logTopics This parameter can be used to enable/disable log topics
* valid topics are ERROR[,INFO,DEBUG,SETUP,ALLOC,RECV,SEND,COMM,DATA,LOCK].
*
* \param globalConfig This parameter can be used to pass different parameters to
* the library. I.e. enabling automatic connection.
*/
static DeployUnit* getInstance(const std::string& logTopics = "",
const SilecsWrapper::DeployConfig& globalConfig = SilecsWrapper::DeployConfig())
{
if (_instance == NULL)
{
_instance = new DeployUnit(logTopics, globalConfig);
}
else
{
if (logTopics.empty() == false)
{
_instance->getService()->setLogTopics(logTopics);
}
}
return dynamic_cast<DeployUnit*>(_instance);
}
/*!
* \brief Use this method to create/get the unique instance of the Deploy Unit.
*
* \param globalConfig This parameter can be used to pass different parameters to
* the library. I.e. enabling automatic connection.
*/
static DeployUnit* getInstance(const SilecsWrapper::DeployConfig& globalConfig)
{
return getInstance("", globalConfig);
}
/*!
* \brief Return pointer to the deployed design SilecsHeader.
*/
SilecsHeader::Design* getSilecsHeader()
{
return _SilecsHeader;
}
/*!
* \brief Return pointer to the deployed design SilecsTestClass.
*/
SilecsTestClass::Design* getSilecsTestClass()
{
return _SilecsTestClass;
}
private:
SilecsHeader::Design* _SilecsHeader;
SilecsTestClass::Design* _SilecsTestClass;
DeployUnit(const std::string& logTopics, const SilecsWrapper::DeployConfig& globalConfig) :
SilecsWrapper::DeployUnit("SilecsTestClass_DU", "0.1.0", logTopics, globalConfig)
{
// Construct Design SilecsHeader
_SilecsHeader = new SilecsHeader::Design((SilecsWrapper::DeployUnit*) this);
// Construct Design SilecsTestClass
_SilecsTestClass = new SilecsTestClass::Design((SilecsWrapper::DeployUnit*) this);
}
~DeployUnit()
{
delete _SilecsHeader;
delete _SilecsTestClass;
}
};
class Controller : public SilecsWrapper::Controller
{
public:
Controller(SilecsWrapper::Design *design, const std::string parameterFile) :
SilecsWrapper::Controller("tsts7001", "", design, parameterFile)
{
_deviceMap.insert(std::pair<std::string, SilecsWrapper::Device*>("SilecsHeader", new SilecsWrapper::Device("SilecsHeader", this)));
_deviceMap.insert(std::pair<std::string, SilecsWrapper::Device*>("dev0", new SilecsWrapper::Device("dev0", this)));
}
~Controller()
{
map<std::string, SilecsWrapper::Device*>::iterator it;
for (it = _deviceMap.begin(); it != _deviceMap.end(); it++)
{
delete it->second;
}
}
/*!
* \brief Return pointer to the requested device.
* \param label Device label.
*/
SilecsWrapper::Device* getDevice(const std::string& label)
{
if (_deviceMap.find(label) != _deviceMap.end())
{
return _deviceMap[label];
}
throw Silecs::SilecsException(__FILE__, __LINE__, Silecs::PARAM_UNKNOWN_DEVICE_NAME, label);
}
std::map<std::string, SilecsWrapper::Device*>& getDeviceMap()
{
return _deviceMap;
}
/*!
* \brief Get pointer to device SilecsHeader.
*/
SilecsWrapper::Device* getSilecsHeader()
{
return _deviceMap["SilecsHeader"];
}
/*!
* \brief Get pointer to device dev0.
*/
SilecsWrapper::Device* getDev0()
{
return _deviceMap["dev0"];
}
private:
std::map<std::string, SilecsWrapper::Device*> _deviceMap;
};
} /* namespace SilecsTestClass_DU */
#endif /* SILECSTESTCLASS_DU_H_ */
<?xml version="1.0" encoding="UTF-8"?>
<deploy-unit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/opt/fesa/fesa-fwk/7.4.0/fesa-model-gsi/xml/deployment/deployment-gsi.xsd">
<include><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="/home/bel/mnabywan/lnx/workspace-silecs-course/SilecsTestClass/generated/xml/SilecsTestClassSchedulingView.xml"/></include>
<deploy-unit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:/opt/fesa/fesa-model-gsi/7.4.0/xml/deployment/deployment-gsi.xsd"><include><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="/home/bel/mnabywan/lnx/workspace-silecs-test/SilecsTestClass/generated/xml/SilecsTestClassSchedulingView.xml"/></include>
<information>
<deploy-unit-name>SilecsTestClassDU</deploy-unit-name>
<deploy-unit-name>SilecsTestClass_DU</deploy-unit-name>
<deploy-unit-major-version>0</deploy-unit-major-version>
<deploy-unit-minor-version>1</deploy-unit-minor-version>
<deploy-unit-tiny-version>0</deploy-unit-tiny-version>
......@@ -19,14 +18,12 @@
<class-minor-version>1</class-minor-version>
<class-tiny-version>0</class-tiny-version>
<device-instance>required</device-instance>
<path>/home/bel/mnabywan/lnx/workspace-silecs-course/SilecsTestClass</path>
</class>
<path>/home/bel/mnabywan/lnx/workspace-silecs-test/SilecsTestClass</path></class>
<scheduler>
<concurrency-layer name="default" threading-policy="single" id="_220816150343_0">
<scheduling-unit scheduling-unit-name-ref="SilecsTestClass::StatusUpdateSchedulingUnit"/>
<concurrency-layer name="default" threading-policy="single" id="_220830122259_0">
<scheduling-unit scheduling-unit-name-ref="SilecsTestClass::StatusUpdateSchedulingUnit" />
</concurrency-layer>
</scheduler>
<executable>
<mixed extension="_M"/>
<executable><mixed extension="_M" />
</executable>
</deploy-unit>
<?xml version="1.0" encoding="UTF-8"?>
<SILECS-Deploy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" silecs-version="2.3.0" created="08/30/2022" updated="08/30/2022" xsi:noNamespaceSchemaLocation="/common/usr/cscofe/silecs/2.3.0/silecs-model/xml/DeploySchema.xsd">
<Information>
<Owner user-login="mnabywan"/>
<Editor user-login="mnabywan"/>
</Information>
<Deploy-Unit name="SilecsTestClass_DU" version="0.1.0"/>
<SilecsDesign silecs-design-name="SilecsTestClass" silecs-design-version="0.1.0"/>
<Controller host-name="tsts7001">
<Siemens-PLC system="TIA-PORTAL" model="SIMATIC_S7-1500" protocol="DEVICE_MODE" base-DB-number="1">
<Device silecs-device-label="dev0" silecs-design-ref="SilecsTestClass" fesa-device-name="testDeviceSilecs1" fesa-fec-name="SilecsTestClass"/>
</Siemens-PLC>
</Controller>
</SILECS-Deploy>
import os
import sys
import unittest
import filecmp
import shutil
from mock import patch
RELEASE_PARAM_DIR_PATH = os.path.join("tests", "releaseParamDir")
os.environ["RELEASE_PARAM_DIR"] = RELEASE_PARAM_DIR_PATH
sys.path.append('../')
from silecs_cli import silecs
import silecs
BASE_FOR_BACKUP = os.path.join("tests", "examples", "SilecsTestClass.design")
BACKUP = BASE_FOR_BACKUP + ".backup"
DESIGN_PATH = os.path.join("tests", "examples", "SilecsTestClass2.design")
DEPLOY_PATH = os.path.join("tests", "examples", "SilecsTestClass_2_DU.deploy")
DESIGN_PATH = os.path.join("tests", "testClasses", "SilecsTestClass", "src", "SilecsTestClass.design")
DEPLOY_PATH = os.path.join("tests", "testClasses", "SilecsTestClass_DU", "src", "SilecsTestClass_DU.deploy")
BACKUP = DESIGN_PATH + ".backup"
SILECS_DESIGN_PATH = DESIGN_PATH.split(".")[0] + ".silecsdesign"
SILECS_DEPLOY_PATH = DEPLOY_PATH.split(".")[0] + ".silecsdeploy"
RELEASE_PARAM_FILEPATH = os.path.join(RELEASE_PARAM_DIR_PATH, "SilecsTestClass", "SilecsTestClass_DU", "tsts7001.silecsparam")
RELEASE_PARAM_FILEPATH_DEV = os.path.join(RELEASE_PARAM_DIR_PATH, "SilecsTestClass", "SilecsTestClass_DU-d", "tsts7001.silecsparam")
design_schema_path_mock = "../silecs-model/src/xml/DesignSchema.xsd"
deploy_schema_path_mock = "../silecs-model/src/xml/DeploySchema.xsd"
@patch('silecs.DESIGN_SHEMA_PATH', design_schema_path_mock)
@patch('silecs.DEPLOY_SHEMA_PATH', deploy_schema_path_mock)
class SilecsTest(unittest.TestCase):
"""Class to test silecs.py script"""
@classmethod
......@@ -26,8 +39,11 @@ class SilecsTest(unittest.TestCase):
if os.path.isfile(SILECS_DESIGN_PATH):
os.remove(SILECS_DESIGN_PATH)
if os.path.isfile(SILECS_DEPLOY_PATH):
os.remove(SILECS_DEPLOY_PATH)
if os.path.isfile(RELEASE_PARAM_FILEPATH):
shutil.rmtree(RELEASE_PARAM_DIR_PATH)
if os.path.isfile(RELEASE_PARAM_FILEPATH_DEV):
shutil.rmtree(RELEASE_PARAM_DIR_PATH_DEV)
def test_get_extension(self):
"""Test getting extension from file"""
......@@ -92,22 +108,34 @@ class SilecsTest(unittest.TestCase):
def test_create_backup_file(self):
"""Test creating backup file"""
silecs.create_backup_file(BASE_FOR_BACKUP)
silecs.create_backup_file(DESIGN_PATH)
self.assertNotEqual(os.stat(BACKUP).st_size, 0)
def test_silecs_validate(self):
"""Test validating silecs design/deploy files"""
silecs_design_deploy_paths = [os.path.join("tests", "examples", "SilecsTestClass.silecsdesign"), \
os.path.join("tests", "examples", "SilecsTestClassDU.silecsdeploy")]
for path in silecs_design_deploy_paths:
silecs_design_deploy_paths_result = [
(os.path.join("tests", "testClasses", "SilecsTestClass_DU", "src", "SilecsTestClass_DU.silecsdeploy"), True), \
(os.path.join("tests", "examples", "SchneiderM340TestDU_invalid.silecsdeploy"), False), \
(os.path.join("tests", "examples", "SilecsTestClassDU_invalid.silecsdeploy"), False)
]
for path, expected_result in silecs_design_deploy_paths_result:
xsd_path = silecs.get_schema_path(path)
self.assertEqual(silecs.validate(path, xsd_path), True)
self.assertEqual(silecs.validate(path, xsd_path), expected_result)
def test_create_validate(self):
"""Test creating silecs design file and then validate it"""
try:
new_file_path = silecs.get_silecs_file_path_from_fesa(DESIGN_PATH)
silecs.create(new_file_path)
except Exception as e:
print(e)
xsd_path = silecs.get_schema_path(new_file_path)
self.assertEqual(silecs.validate(new_file_path, xsd_path), True)
def test_silecs_validate_invalid(self):
"""Test validating invalid silecs file"""
invalid_silecs_deploy_path = os.path.join("tests", "examples", "SilecsTestClassDU_invalid.silecsdeploy")
xsd_path = silecs.get_schema_path(invalid_silecs_deploy_path)
self.assertEqual(silecs.validate(invalid_silecs_deploy_path, xsd_path), False)
if os.path.isfile(new_file_path):
os.remove(new_file_path)
def test_create_silecs_design(self):
"""Test creating silecs design files from design file"""
......@@ -129,10 +157,6 @@ class SilecsTest(unittest.TestCase):
path = os.path.abspath(DEPLOY_PATH)
new_file_path = silecs.get_silecs_file_path_from_fesa(path)
silecs.create(new_file_path)
print(new_file_path)
self.assertEqual(os.path.exists(new_file_path), True)
self.assertNotEqual(os.stat(new_file_path).st_size, 0)
try:
silecs.create(new_file_path)
......@@ -140,6 +164,16 @@ class SilecsTest(unittest.TestCase):
print(str(e))
self.assertIn("There is already a .silecsdeploy file available:", str(e))
def test_release_param(self):
"""Test release param file"""
result = silecs.release(SILECS_DEPLOY_PATH)
self.assertEqual(result, True)
self.assertEqual(os.path.isfile(RELEASE_PARAM_FILEPATH), True)
self.assertEqual(filecmp.cmp(RELEASE_PARAM_FILEPATH,
os.path.join("tests", "testClasses", "SilecsTestClass_DU", "generated-silecs", "client", "tsts7001.silecsparam")),
True)
if __name__ == "_main__":
unittest.main()