Fix Nullreference error on Opening window, adde SCADA validator

This commit is contained in:
Nicola Carminati
2019-05-10 17:23:57 +02:00
parent caab577c25
commit 240f27bb76
6 changed files with 247 additions and 5 deletions
+201
View File
@@ -0,0 +1,201 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="scada">
<xs:complexType>
<xs:all>
<xs:element name="name" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="backgroundImagePath" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="isInProductionPage" type="xs:boolean" minOccurs='1' maxOccurs='1'/>
<xs:element name="layers">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="layer" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:all>
<xs:element name="buttons">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="button" type="buttonType" minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="images">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="image" type="imageType" minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="labels">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="label" type="labelType" minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="progressBars">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="progressBar" type="progressType" minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="inputs">
<xs:complexType>
<xs:sequence maxOccurs="unbounded">
<xs:element name="input" type="inputType" minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<!-- Button type-->
<xs:complexType name="buttonType">
<xs:all>
<xs:element name="label" type="subLabelType" minOccurs='0' maxOccurs='1' />
<xs:element name="position" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="size" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="status" minOccurs='1' maxOccurs='1'>
<xs:complexType>
<xs:all>
<xs:element name="memClickIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="memVisibleIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
<!-- Image type-->
<xs:complexType name="imageType">
<xs:all>
<xs:element name="imageName" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="position" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="size" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="status" minOccurs='1' maxOccurs='1'>
<xs:complexType>
<xs:all>
<xs:element name="negate" type="xs:boolean" minOccurs='1' maxOccurs='1'/>
<xs:element name="clickEnabled" type="xs:boolean" minOccurs='1' maxOccurs='1'/>
<xs:element name="memClickIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="memVisibleIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
<!-- label type-->
<xs:complexType name="labelType">
<xs:all>
<xs:element name="label" type="subLabelType" minOccurs='1' maxOccurs='1' />
<xs:element name="position" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="size" type="xyType" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
<!-- progress type-->
<xs:complexType name="progressType">
<xs:all>
<xs:element name="position" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="size" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="memValueIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
<!-- input type-->
<xs:complexType name="inputType">
<xs:all>
<xs:element name="label" type="subLabelType" minOccurs='0' maxOccurs='1' />
<xs:element name="position" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="size" type="xyType" minOccurs='1' maxOccurs='1'/>
<xs:element name="status" minOccurs='1' maxOccurs='1'>
<xs:complexType>
<xs:all>
<xs:element name="type" type="inputNumberType" minOccurs='1' maxOccurs='1'/>
<xs:element name="action" type="inputAction" minOccurs='1' maxOccurs='1'/>
<xs:element name="memEnabledIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="memValueIndex" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="round" type="xs:int" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
<!-- XY type -->
<xs:complexType name="xyType">
<xs:all>
<xs:element name="x" type="xs:int" minOccurs='1' maxOccurs='1'/>
<xs:element name="y" type="xs:int" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
<!-- subLabel type -->
<xs:complexType name="subLabelType">
<xs:all>
<xs:element name="backgroundColor" type="hexcolorType" minOccurs='1' maxOccurs='1'/>
<xs:element name="textAlign" type="alignType" minOccurs='1' maxOccurs='1'/>
<xs:element name="textColor" type="hexcolorType" minOccurs='1' maxOccurs='1'/>
<xs:element name="textContent" type="xs:string" minOccurs='1' maxOccurs='1'/>
<xs:element name="textSize" type="xs:int" minOccurs='1' maxOccurs='1'/>
</xs:all>
</xs:complexType>
<!-- inputAction simpleType -->
<xs:simpleType name="inputAction" final="restriction" >
<xs:restriction base="xs:string">
<xs:enumeration value="READ" />
<xs:enumeration value="WRITE" />
</xs:restriction>
</xs:simpleType>
<!-- inputNumberType simpleType -->
<xs:simpleType name="inputNumberType" final="restriction" >
<xs:restriction base="xs:string">
<xs:enumeration value="BOOL" />
<xs:enumeration value="BYTE" />
<xs:enumeration value="WORD" />
<xs:enumeration value="INT" />
<xs:enumeration value="REAL" />
</xs:restriction>
</xs:simpleType>
<!-- align simpleType -->
<xs:simpleType name="alignType" final="restriction" >
<xs:restriction base="xs:string">
<xs:enumeration value="left" />
<xs:enumeration value="right" />
<xs:enumeration value="center" />
</xs:restriction>
</xs:simpleType>
<!-- hexcolor simpleType -->
<xs:simpleType name="hexcolorType" final="restriction" >
<xs:restriction base="xs:token">
<xs:pattern value="#[\dA-Fa-f1-9]{6}([\dA-Fa-f1-9][\dA-Fa-f1-9])?" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
+33 -1
View File
@@ -19,6 +19,8 @@ namespace Step.Config
{
public static class ServerConfigController
{
private static string actualFileName;
public static void ReadStartupConfig()
{
try
@@ -64,6 +66,8 @@ namespace Step.Config
readerSettings.Add(null, schemaReader);
}
}
actualFileName = configFilePath;
// Open file reader
XDocument xmlConfigFile = XDocument.Load(BASE_PATH + "\\" + configFilePath);
@@ -73,6 +77,30 @@ namespace Step.Config
return xmlConfigFile;
}
private static void validateScada(string configSchemaFilePath, string configFilePath)
{
// Create new instance
XmlSchemaSet readerSettings = new XmlSchemaSet();
// Add Schema from Assembly
Assembly myAssembly = Assembly.GetExecutingAssembly();
using (Stream schemaStream = myAssembly.GetManifestResourceStream(configSchemaFilePath))
{
using (XmlReader schemaReader = XmlReader.Create(schemaStream))
{
readerSettings.Add(null, schemaReader);
}
}
actualFileName = Path.GetFileName(configFilePath);
// Open file reader
XDocument xmlConfigFile = XDocument.Load(configFilePath);
// Validate file
xmlConfigFile.Validate(readerSettings, ValidationHandler);
}
private static void SetAreaValueByName(XElement element)
{
// Choose which area to be set
@@ -140,7 +168,7 @@ namespace Step.Config
{
ExceptionManager.Manage(ERROR_LEVEL.FATAL,
// "Error while reading file: " + e.Exception.SourceUri +
"Error while reading configuration file: " + e.Message,
"Error while reading XML file \"" + actualFileName + "\" \n\n" + e.Message,
true
);
}
@@ -192,9 +220,13 @@ namespace Step.Config
// Cycle inside xml files
foreach (var file in files)
{
validateScada(SCADA_PAGES_SCHEMA_PATH, SCADA_DIRECTORY + file.Name);
StreamReader sr = new StreamReader(SCADA_DIRECTORY + file.Name);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(ScadaSchemaModel));
ScadaSchemaModel schema = xmlSerializer.Deserialize(sr) as ScadaSchemaModel;
// Setup incremental ids
schema.Id = i++;
+5
View File
@@ -136,5 +136,10 @@
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Config\scadaValidator.xsd">
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+4 -1
View File
@@ -184,7 +184,10 @@ namespace Step.Model
public const string MACROS_CONFIG_PATH = CONFIG_DIRECTORY + "macrosConfig.xml";
public static string LANGUAGE_PACK_DIRECTORY = BASE_PATH + "\\languages\\";
public static string LANGUAGE_SCHEMA_PATH = BASE_PATH + "\\LanguageValidator.xsd";
public static string LANGUAGE_SCHEMA_PATH = BASE_PATH + "\\LanguageValidator.xsd";
public const string SCADA_PAGES_SCHEMA_PATH = RESOURCE_DIRECTORY + "scadaValidator.xsd";
public static string CANDY_DUMMYFILE_PATH = BASE_PATH + "\\dll.dll";
// MVVM Messages to server UI
+1 -1
View File
@@ -1037,7 +1037,7 @@ namespace Step.NC
});
}
if (layer.Inputs.ElementAtOrDefault(i) != null && layer.Inputs[i].Status.Action == "read")
if (layer.Inputs.ElementAtOrDefault(i) != null && layer.Inputs[i].Status.Action.ToLower() == "read")
{
// Read isVisible from PLC
//cmsError = numericalControl.PLC_RScadaValue(layer.Inputs[i].Status.MemEnabledIndex, SCADA_MEM_TYPE.BOOL, ref val);
+3 -2
View File
@@ -36,8 +36,6 @@ namespace Step
return;
}
// Start WinForm
ServerControlWindow.Start();
// Create unhandled exception handler
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ExceptionHandler);
@@ -45,6 +43,9 @@ namespace Step
// Read config
ServerConfigController.ReadStartupConfig();
// Start WinForm
ServerControlWindow.Start();
DatabaseContext.SetUpDbConnectionAndDbConfig();
// Register listener to "close application" messages