Skip to content

Commit

Permalink
Merge pull request #8 from NecatiMeral/feature/broetje-ventilation-sy…
Browse files Browse the repository at this point in the history
…stem

Feature/broetje ventilation system
NecatiMeral authored May 19, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents f2c2005 + 6e7cbee commit d61d175
Showing 27 changed files with 2,321 additions and 21 deletions.
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -6,8 +6,16 @@ Custom logic nodes for personal use and other useful stuff to use with the GIRA

GIRA's documentation of the logic node SDK can be found on the [Gira Logic nodes page](https://partner.gira.com/en/service/software-tools/developer.html).

When using the nodes from this repository, you can hit the `F1` key in the logic editor for help.

## Logic nodes

### Necati_Meral_Yahoo_De.Logic.Ads

* Contains logic nodes to interact with [Beckhoff TwinCAT](https://www.beckhoff.com/de-de/produkte/automation/twincat/txxxxx-twincat-2-base/tabellarische-produktuebersicht/) systems by utilizing the [ADS (Automation Device Specification)](https://infosys.beckhoff.com/index.php?content=../content/1031/tcba/12269581963.html&id=8978321744740978019) protocol.
* [ADS: Read value (german)](https://necatimeral.github.io/gira-x1-logic-nodes/dotnet/src/NecatiMeral.Logic.Ads/help/ReadAdsDataNode.html)
* [ADS: Write value (german)](https://necatimeral.github.io/gira-x1-logic-nodes/dotnet/src/NecatiMeral.Logic.Ads/help/WriteAdsDataNode.html)

### Necati_Meral_Yahoo_De.Logic.ComfortOnline

* Contains a logic module to retrieve data from the Comfort online platform of the heating manufacturer KWB.
@@ -18,6 +26,7 @@ GIRA's documentation of the logic node SDK can be found on the [Gira Logic nodes
* Contains general logic nodes
* [Key value selection (german)](https://necatimeral.github.io/gira-x1-logic-nodes/dotnet/src/NecatiMeral.Logic.Common/help/KeyValueNode.html)


## Standalone tools

### doorbird-x1-listener
@@ -33,3 +42,8 @@ Docker service which acts as a proxy to integrate a doorbird doorbell into a gir
## Scripts

Contains scripts for minor automations of our home.


## Icons

This project uses [icons](images/Noun-Project/readme.md) from the glorious noun project.
4 changes: 2 additions & 2 deletions dotnet/Directory.Build.props
Original file line number Diff line number Diff line change
@@ -51,7 +51,7 @@
<Reference Include="LogicModule.Nodes.TestHelper">
<HintPath>$(SolutionDir)src\LogicNodesSDK\LogicModule.Nodes.TestHelper.dll</HintPath>
</Reference>

<Using Include="Xunit" />

<PackageReference Include="coverlet.collector" Version="3.1.2">
@@ -85,7 +85,7 @@

<!-- xunit.runner.visualstudio https://www.nuget.org/packages/xunit.runner.visualstudio -->
<xUnitRunnerVisualstudioPackageVersion>2.4.1</xUnitRunnerVisualstudioPackageVersion>

<!-- Microsoft Framework Extensions -->
<MicrosoftPackageVersion>7.0.*</MicrosoftPackageVersion>

7 changes: 7 additions & 0 deletions dotnet/NecatiMeral.LogicNodes.sln
Original file line number Diff line number Diff line change
@@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NecatiMeral.Logic.Common",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NecatiMeral.DoorbirdX1Listener.Host", "src\NecatiMeral.DoorbirdX1Listener.Host\NecatiMeral.DoorbirdX1Listener.Host.csproj", "{570B3ED5-A839-492B-A0A1-7070E9DF0300}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NecatiMeral.Logic.Ads", "src\NecatiMeral.Logic.Ads\NecatiMeral.Logic.Ads.csproj", "{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -49,6 +51,10 @@ Global
{570B3ED5-A839-492B-A0A1-7070E9DF0300}.Debug|Any CPU.Build.0 = Debug|Any CPU
{570B3ED5-A839-492B-A0A1-7070E9DF0300}.Release|Any CPU.ActiveCfg = Release|Any CPU
{570B3ED5-A839-492B-A0A1-7070E9DF0300}.Release|Any CPU.Build.0 = Release|Any CPU
{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -59,6 +65,7 @@ Global
{3F1FF768-FD27-46B2-961C-B6EFDF9CB3B3} = {B4F57F38-7B57-4225-9BD4-264ABC47DE33}
{722DD859-ABFA-4B2C-94A6-5D4AD5C5F377} = {B4F57F38-7B57-4225-9BD4-264ABC47DE33}
{570B3ED5-A839-492B-A0A1-7070E9DF0300} = {B4F57F38-7B57-4225-9BD4-264ABC47DE33}
{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4} = {B4F57F38-7B57-4225-9BD4-264ABC47DE33}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {471310B7-D205-4EEC-A063-0A534164AB9A}
5 changes: 5 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/AdsConsts.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace Necati_Meral_Yahoo_De.Logic.Ads;
internal class AdsConsts
{
public const int ReadWriteLength = 84;
}
93 changes: 93 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/AdsDataNode.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using System.Text;
using LogicModule.ObjectModel.TypeSystem;
using Necati_Meral_Yahoo_De.LogicNodes;

namespace Necati_Meral_Yahoo_De.Logic.Ads;
public abstract class AdsDataNode : LocalizableNode
{
[Input(DisplayOrder = 2, IsDefaultShown = true, IsInput = false)]
public StringValueObject RemoteAddress { get; }

[Input(DisplayOrder = 3, IsDefaultShown = true, IsInput = false)]
public StringValueObject NetId { get; }

[Input(DisplayOrder = 4, IsDefaultShown = true, IsInput = false)]
public IntValueObject Port { get; }

[Input(DisplayOrder = 5, IsDefaultShown = true, IsInput = false)]
public UIntValueObject IndexGroup { get; }

[Input(DisplayOrder = 6, IsDefaultShown = true, IsInput = false)]
public UIntValueObject IndexOffset { get; }

[Input(DisplayOrder = 7, IsDefaultShown = true, IsInput = false)]
public EnumValueObject DataType { get; }

[Output(DisplayOrder = 99, IsDefaultShown = false)]
public StringValueObject Diagnostics { get; }

protected Encoding Encoding { get; }

public AdsDataNode(INodeContext context, string nodeTypeName)
: base(context, nodeTypeName)
{
context.ThrowIfNull("context");

RemoteAddress = TypeService.CreateString(PortTypes.String, "RemoteAddress", string.Empty);
NetId = TypeService.CreateString(PortTypes.String, "NetId", string.Empty);
Port = TypeService.CreateInt(PortTypes.Integer, "Port", 800);
IndexGroup = TypeService.CreateUInt(PortTypes.DWord, "IndexGroup", 16416);
IndexOffset = TypeService.CreateUInt(PortTypes.DWord, "IndexOffset", 0);
DataType = TypeService.CreateEnum(nameof(AdsType), "DataType", AdsType.Values, AdsType.String);

Diagnostics = TypeService.CreateString(PortTypes.String, "Diagnostics", string.Empty);

Encoding = Encoding.ASCII;
}

protected virtual object ConvertValue(byte[] data)
{
return DataType.Value switch
{
AdsType.Boolean => BitConverter.ToBoolean(data, 0),
AdsType.Int16 => BitConverter.ToInt16(data, 1),
_ => Encoding.GetString(data, 3, 81)
};
}

protected virtual byte[] GetBytes(object data)
{
return DataType.Value switch
{
AdsType.Boolean => BitConverter.GetBytes(AsBoolean(data)),
AdsType.Int16 => BitConverter.GetBytes(AsShort(data)),
_ => Encoding.GetBytes(data?.ToString())
};
}

protected virtual bool AsBoolean(object data)
{
if (data is bool booleanValue)
{
return booleanValue;
}

var dataAsString = data?.ToString();

return dataAsString == "1" || dataAsString.Equals("TRUE", StringComparison.OrdinalIgnoreCase);
}

protected virtual short AsShort(object data)
{
if (short.TryParse(data?.ToString(), out var shortValue))
{
return shortValue;
}
return 0;
}

protected string GetExceptionDebugMessage(Exception exception)
{
return $"[{exception.GetType()}] {exception.Message}";
}
}
11 changes: 11 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/AdsType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Necati_Meral_Yahoo_De.Logic.Ads;
public static class AdsType
{
public const string Int16 = "16 bit integer";

public const string String = "String";

public const string Boolean = "Boolean";

public static string[] Values { get; } = new[] { Int16, String, Boolean };
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"ExtendedData": {
"inputs": [
"TcAdsWebService.wsdl"
],
"collectionTypes": [
"System.Array",
"System.Collections.Generic.Dictionary`2"
],
"internalTypeAccess": true,
"namespaceMappings": [
"*, TcAdsWebService"
],
"targetFramework": "net45",
"typeReuseMode": "None"
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:typens="http://beckhoff.org/type" xmlns:stk="http://schemas.microsoft.com/soap-toolkit/wsdl-extension" xmlns:wsdlns="http://beckhoff.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TcAdsWebService" targetNamespace="http://beckhoff.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<xsd:schema xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" elementFormDefault="qualified" targetNamespace="http://beckhoff.org/type" />
</types>
<message name="TcAdsSync.Write">
<part name="netId" type="xsd:string" />
<part name="nPort" type="xsd:int" />
<part name="indexGroup" type="xsd:unsignedInt" />
<part name="indexOffset" type="xsd:unsignedInt" />
<part name="pData" type="xsd:base64Binary" />
</message>
<message name="TcAdsSync.WriteResponse" />
<message name="TcAdsSync.Read">
<part name="netId" type="xsd:string" />
<part name="nPort" type="xsd:int" />
<part name="indexGroup" type="xsd:unsignedInt" />
<part name="indexOffset" type="xsd:unsignedInt" />
<part name="cbLen" type="xsd:int" />
</message>
<message name="TcAdsSync.ReadResponse">
<part name="ppData" type="xsd:base64Binary" />
</message>
<message name="TcAdsSync.ReadWrite">
<part name="netId" type="xsd:string" />
<part name="nPort" type="xsd:int" />
<part name="indexGroup" type="xsd:unsignedInt" />
<part name="indexOffset" type="xsd:unsignedInt" />
<part name="cbRdLen" type="xsd:int" />
<part name="pwrData" type="xsd:base64Binary" />
</message>
<message name="TcAdsSync.ReadWriteResponse">
<part name="ppRdData" type="xsd:base64Binary" />
</message>
<message name="TcAdsSync.ReadState">
<part name="netId" type="xsd:string" />
<part name="nPort" type="xsd:int" />
</message>
<message name="TcAdsSync.ReadStateResponse">
<part name="pAdsState" type="xsd:int" />
<part name="pDeviceState" type="xsd:int" />
</message>
<message name="TcAdsSync.WriteControl">
<part name="netId" type="xsd:string" />
<part name="nPort" type="xsd:int" />
<part name="adsState" type="xsd:int" />
<part name="deviceState" type="xsd:int" />
<part name="pData" type="xsd:base64Binary" />
</message>
<message name="TcAdsSync.WriteControlResponse" />
<portType name="TcAdsSyncSoapPort">
<operation name="Write" parameterOrder="netId nPort indexGroup indexOffset pData">
<input message="wsdlns:TcAdsSync.Write" />
<output message="wsdlns:TcAdsSync.WriteResponse" />
</operation>
<operation name="Read" parameterOrder="netId nPort indexGroup indexOffset cbLen ppData">
<input message="wsdlns:TcAdsSync.Read" />
<output message="wsdlns:TcAdsSync.ReadResponse" />
</operation>
<operation name="ReadWrite" parameterOrder="netId nPort indexGroup indexOffset cbRdLen ppRdData pwrData">
<input message="wsdlns:TcAdsSync.ReadWrite" />
<output message="wsdlns:TcAdsSync.ReadWriteResponse" />
</operation>
<operation name="ReadState" parameterOrder="netId nPort pAdsState pDeviceState">
<input message="wsdlns:TcAdsSync.ReadState" />
<output message="wsdlns:TcAdsSync.ReadStateResponse" />
</operation>
<operation name="WriteControl" parameterOrder="netId nPort adsState deviceState pData">
<input message="wsdlns:TcAdsSync.WriteControl" />
<output message="wsdlns:TcAdsSync.WriteControlResponse" />
</operation>
</portType>
<binding name="TcAdsSyncSoapBinding" type="wsdlns:TcAdsSyncSoapPort">
<stk:binding preferredEncoding="UTF-8" />
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" />
<operation name="Write">
<soap:operation soapAction="http://beckhoff.org/action/TcAdsSync.Write" />
<input>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="Read">
<soap:operation soapAction="http://beckhoff.org/action/TcAdsSync.Read" />
<input>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="ReadWrite">
<soap:operation soapAction="http://beckhoff.org/action/TcAdsSync.ReadWrite" />
<input>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="ReadState">
<soap:operation soapAction="http://beckhoff.org/action/TcAdsSync.ReadState" />
<input>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
<operation name="WriteControl">
<soap:operation soapAction="http://beckhoff.org/action/TcAdsSync.WriteControl" />
<input>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</input>
<output>
<soap:body use="encoded" namespace="http://beckhoff.org/message/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
</output>
</operation>
</binding>
<service name="TcAdsWebService">
<port name="TcAdsSyncSoapPort" binding="wsdlns:TcAdsSyncSoapBinding">
<soap:address location="http://localhost/TcAdsWebService/TcAdsWebService.dll" />
</port>
</service>
</definitions>
51 changes: 51 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/Manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{
"PackageFormatVersion": "1.0",
"Assembly": "Necati_Meral_Yahoo_De.Logic.Ads.dll",
"PackageName": {
"en": "ADS client nodes",
"de": "ADS client Logikbausteine"
},
"DependentFiles": [
"NecatiMeral.LogicNodes.dll",
"LogicModule.Nodes.Helpers.dll",
"LogicModule.ObjectModel.dll"
],
"Version": "0.1.0",
"Author": "Necati Meral",
"Copyright": "2023 Necati Meral",
"DeveloperId": "necati_meral_yahoo_de",
"License": "Free",
"PackageId": "3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4",
"Nodes": [
{
"Type": "Necati_Meral_Yahoo_De.Logic.Ads.ReadAdsDataNode",
"Name": {
"en": "ADS: Read value",
"de": "ADS: Wert lesen"
},
"IsConverter": false,
"Category": "Node",
"DefaultIcon": "icons/noun-ventilation-3506887-44x44.png",
"HelpTooltip": {
"en": "Reads a value by using the ADS protocol.",
"de": "Ließt einen Wert mit Hilfe des ADS-Protokolls."
},
"HelpFileReference": "$help/ReadAdsDataNode.html"
},
{
"Type": "Necati_Meral_Yahoo_De.Logic.Ads.WriteAdsDataNode",
"Name": {
"en": "ADS: Write value",
"de": "ADS: Wert schreiben"
},
"IsConverter": false,
"Category": "Node",
"DefaultIcon": "icons/noun-ventilation-3506887-44x44.png",
"HelpTooltip": {
"en": "Writes a value by using the ADS protocol.",
"de": "Schreibt einen Wert mit Hilfe des ADS-Protokolls."
},
"HelpFileReference": "$help/WriteAdsDataNode.html"
}
]
}
48 changes: 48 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/NecatiMeral.Logic.Ads.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net45</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<ProjectGuid>{3F1FF768-FD27-46B2-961C-B6EFDF9CB3A4}</ProjectGuid>
<AssemblyName>Necati_Meral_Yahoo_De.Logic.Ads</AssemblyName>
<RootNamespace>Necati_Meral_Yahoo_De.Logic.Ads</RootNamespace>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\NecatiMeral.LogicNodes\NecatiMeral.LogicNodes.csproj" />
</ItemGroup>

<ItemGroup>
<Reference Include="System.ServiceModel" />
</ItemGroup>

<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>

<ItemGroup>
<None Update="Manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="icons\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="help\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

<Reference Update="System.IO.Compression.FileSystem">
<IncludeAssets>all</IncludeAssets>
<Private>True</Private>
</Reference>
</ItemGroup>

</Project>
216 changes: 216 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/Properties/Resources.Designer.cs
171 changes: 171 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/Properties/Resources.de.resx
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ReadAdsDataNodeData" xml:space="preserve">
<value>Ausgang</value>
</data>
<data name="ReadAdsDataNodeDataType" xml:space="preserve">
<value>Datentyp</value>
</data>
<data name="ReadAdsDataNodeIndexGroup" xml:space="preserve">
<value>Index-Group</value>
</data>
<data name="ReadAdsDataNodeIndexOffset" xml:space="preserve">
<value>Index-Offset</value>
</data>
<data name="ReadAdsDataNodeNetId" xml:space="preserve">
<value>NET ID</value>
</data>
<data name="ReadAdsDataNodePort" xml:space="preserve">
<value>Port</value>
</data>
<data name="ReadAdsDataNodeRemoteAddress" xml:space="preserve">
<value>Remote-Adresse</value>
</data>
<data name="ReadAdsDataNodeTrgger" xml:space="preserve">
<value>Trigger</value>
</data>
<data name="WriteAdsDataNodeData" xml:space="preserve">
<value>Eingang</value>
</data>
<data name="WriteAdsDataNodeDataType" xml:space="preserve">
<value>Datentyp</value>
</data>
<data name="WriteAdsDataNodeDiagnostics" xml:space="preserve">
<value>Diagnosemeldung</value>
</data>
<data name="WriteAdsDataNodeIndexGroup" xml:space="preserve">
<value>Index-Group</value>
</data>
<data name="WriteAdsDataNodeIndexOffset" xml:space="preserve">
<value>Index-Offset</value>
</data>
<data name="WriteAdsDataNodeNetId" xml:space="preserve">
<value>NET ID</value>
</data>
<data name="WriteAdsDataNodePort" xml:space="preserve">
<value>Port</value>
</data>
<data name="WriteAdsDataNodeRemoteAddress" xml:space="preserve">
<value>Remote-Adresse</value>
</data>
<data name="ReadAdsDataNodeDiagnostics" xml:space="preserve">
<value>Diagnosemeldung</value>
</data>
</root>
171 changes: 171 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/Properties/Resources.resx
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ReadAdsDataNodeData" xml:space="preserve">
<value>Output</value>
</data>
<data name="ReadAdsDataNodeDataType" xml:space="preserve">
<value>Data type</value>
</data>
<data name="ReadAdsDataNodeDiagnostics" xml:space="preserve">
<value>Diagnostic message</value>
</data>
<data name="ReadAdsDataNodeIndexGroup" xml:space="preserve">
<value>Index-Group</value>
</data>
<data name="ReadAdsDataNodeIndexOffset" xml:space="preserve">
<value>Index-Offset</value>
</data>
<data name="ReadAdsDataNodeNetId" xml:space="preserve">
<value>NET ID</value>
</data>
<data name="ReadAdsDataNodePort" xml:space="preserve">
<value>Port</value>
</data>
<data name="ReadAdsDataNodeRemoteAddress" xml:space="preserve">
<value>Remote-Address</value>
</data>
<data name="ReadAdsDataNodeTrgger" xml:space="preserve">
<value>Trigger</value>
</data>
<data name="WriteAdsDataNodeData" xml:space="preserve">
<value>Input</value>
</data>
<data name="WriteAdsDataNodeDataType" xml:space="preserve">
<value>Data type</value>
</data>
<data name="WriteAdsDataNodeDiagnostics" xml:space="preserve">
<value>Diagnostic message</value>
</data>
<data name="WriteAdsDataNodeIndexGroup" xml:space="preserve">
<value>Index-Group</value>
</data>
<data name="WriteAdsDataNodeIndexOffset" xml:space="preserve">
<value>Index-Offset</value>
</data>
<data name="WriteAdsDataNodeNetId" xml:space="preserve">
<value>NET ID</value>
</data>
<data name="WriteAdsDataNodePort" xml:space="preserve">
<value>Port</value>
</data>
<data name="WriteAdsDataNodeRemoteAddress" xml:space="preserve">
<value>Remote-Address</value>
</data>
</root>
49 changes: 49 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/ReadAdsDataNode.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using LogicModule.ObjectModel.TypeSystem;
using Necati_Meral_Yahoo_De.Helpers;
using TcAdsWebService;

namespace Necati_Meral_Yahoo_De.Logic.Ads;
public class ReadAdsDataNode : AdsDataNode
{
[Input(DisplayOrder = 1, IsRequired = true)]
public BoolValueObject Trigger { get; }

[Output(DisplayOrder = 8, IsDefaultShown = true)]
public AnyValueObject Data { get; }

public ReadAdsDataNode(INodeContext context)
: base(context, nameof(ReadAdsDataNode))
{
context.ThrowIfNull("context");

Trigger = TypeService.CreateBool(PortTypes.Binary, "Trigger", false);
Data = TypeService.CreateAny(PortTypes.Any, "Data");
}

public override void Execute()
{
if (Data.HasValue && Data.WasSet)
{
try
{
var data = AsyncHelper.RunSync(ExecuteAsync);
Data.Value = data;
Diagnostics.Value = string.Empty;
}
catch (Exception ex)
{
Diagnostics.Value = GetExceptionDebugMessage(ex);
}
}
}

protected async Task<object> ExecuteAsync()
{
var service = new TcAdsSyncSoapPortClient(TcAdsSyncSoapPortClient.EndpointConfiguration.TcAdsSyncSoapPort, RemoteAddress);
var value = await service
.ReadAsync(NetId.Value, Port.Value, IndexGroup.Value, IndexOffset.Value, AdsConsts.ReadWriteLength)
.ConfigureAwait(false);

return ConvertValue(value.ppData);
}
}
43 changes: 43 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/WriteAdsDataNode.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using LogicModule.ObjectModel.TypeSystem;
using Necati_Meral_Yahoo_De.Helpers;
using TcAdsWebService;

namespace Necati_Meral_Yahoo_De.Logic.Ads;
public class WriteAdsDataNode : AdsDataNode
{
[Input(DisplayOrder = 8, IsDefaultShown = true, IsInput = true)]
public AnyValueObject Data { get; }

public WriteAdsDataNode(INodeContext context)
: base(context, nameof(WriteAdsDataNode))
{
context.ThrowIfNull("context");

Data = TypeService.CreateAny(PortTypes.Any, "Data");
}

public override void Execute()
{
if (Data.HasValue && Data.WasSet)
{
try
{
AsyncHelper.RunSync(ExecuteAsync);
Diagnostics.Value = string.Empty;
}
catch (Exception ex)
{
Diagnostics.Value = GetExceptionDebugMessage(ex);
}
}
}

protected async Task ExecuteAsync()
{
var service = new TcAdsSyncSoapPortClient(TcAdsSyncSoapPortClient.EndpointConfiguration.TcAdsSyncSoapPort, RemoteAddress);
var data = GetBytes(Data.Value);
_ = await service
.WriteAsync(NetId.Value, Port.Value, IndexGroup.Value, IndexOffset.Value, data)
.ConfigureAwait(false);
}
}
219 changes: 219 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/help/ReadAdsDataNode.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,219 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>NecatiMeral - Hilfe - ComfortOnline Eingang</title>
<link rel="StyleSheet" href="default.css" type="text/css" />
</head>

<body>
<header>
<span id="headBlack">NecatiMeral Logikbausteine</span>
<span id="headGray">Hilfe</span>
</header>
<section>
<div class="contentholder">
<div class="navlinks-top"></div>
<h1>
<img src="../icons/noun-ventilation-3506887-44x44.png" alt="" />&nbsp;
ADS: Wert lesen
</h1>
<h2>Inhaltsverzeichnis</h2>
<img
src="ReadAdsDataNode.png"
alt=""
class="description"
/>
<ul>
<li><a href="#description">Beschreibung</a></li>
<li><a href="#inputs">Eingänge</a></li>
<li><a href="#outputs">Ausgänge</a></li>
<li><a href="#related-links">Weiterführende Links</a></li>
</ul>
<h2 id="description">Beschreibung</h2>
<p>
Mit diesem Baustein kann man mithilfe des ADS-Protokolls (Automation Device Specification)
der Firma Beckhoff Daten aus einem TwinCAT system daten lesen.

Dieses System wird unter anderem in Wohnraumlüftungen der Firma Brötje verwendet.
</p>
<h2 id="inputs">Eingänge</h2>
<p>
Um Daten abzurufen, muss der <c>Trigger</c>-Eingang
geschaltet werden. Weitere Eingänge sind:
</p>
<table class="Tabelle_Logicnode">
<colgroup>
<col style="width: 115px" />
<col style="width: 180px" />
<col />
</colgroup>
<tr>
<th>Bezeichnung</th>
<th>Porttyp</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>
<p><i>Trigger</i></p>
</td>
<td>
<p>Bool</p>
</td>
<td>
<p>Triggert das abrufen der Daten</p>
</td>
</tr>
<tr>
<td>
<p><i>Remote-Adresse</i></p>
</td>
<td>
<p>Text</p>
</td>
<td>
<p>
Die Adresse des SOAP-API-Hosts.
</p>
</td>
</tr>
<tr>
<td>
<p><i>NET ID</i></p>
</td>
<td>
<p>Text</p>
</td>
<td>
<p>
Hiermit ist die AMS NET ID, oder auch die TwinCAT system ID gemeint.
</p>
<p>
Dies kann zum Beispiel wie folgt aufgebaut sein: `192.168.178.24.1.1`
</p>
</td>
</tr>
<tr>
<td>
<p><i>Port</i></p>
</td>
<td>
<p>Integer</p>
</td>
<td>
<p>
Portnummer. Die TwinCAT Geräte-ID.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Index-Gruppe</i></p>
</td>
<td>
<p>16-Bit Integer</p>
</td>
<td>
<p>
Index Group der Daten, die gelesen werden sollen.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Index-Offset</i></p>
</td>
<td>
<p>16-Bit Integer</p>
</td>
<td>
<p>
Index Offset der Daten, die gelesen werden sollen.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Datentyp</i></p>
</td>
<td>
<p>Auswahl</p>
</td>
<td>
<p>
Der erwartete Datentyp.
</p>
</td>
</tr>
</table>
<h2 id="outputs">Ausgänge</h2>
<table class="Tabelle_Logicnode">
<colgroup>
<col style="width: 115px" />
<col style="width: 180px" />
<col />
</colgroup>
<tr>
<th>Bezeichnung</th>
<th>Porttyp</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>
<p><i>Data</i></p>
</td>
<td>
<p>Any</p>
</td>
<td>
<p>
Gibt bei Erfolg den ausgelesenen Wert aus.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Diagnostics</i></p>
</td>
<td>
<p>Text</p>
</td>
<td>
<p>Im Fehlerfall: Detailinformationen zur Diagnose.</p>
</td>
</tr>
</table>
<h2 id="related-links">Weiterführende Links</h2>
<div class="row">
<ul>
<li>
<a href="https://www.plccoder.com/communicating-between-beckhoff-controllers-part-2-ads/">
PLCCoder.com: Communicating between Beckhoff controllers part 2: ADS
</a>
</li>
<li>
<a href="https://infosys.beckhoff.com/index.php?content=../content/1031/tcba/12269581963.html&id=8978321744740978019">
Beckhoff Information System: TS8040 | TwinCAT 2 Building Automation > Lüftungsanlagen
</a>
</li>
</ul>
</div>
</div>
</section>
<footer>
<div id="footerHead">
NecatiMeral Logikbausteine &nbsp;
<span style="color: #a0a0a0">Hilfe</span>
</div>
<div id="footerNav">
<span style="float: right"
><a
href="https://github.com/NecatiMeral/gira-x1-logic-nodes"
target="_blank"
>NecatiMeral / gira-x1-logic-nodes auf GitHub</a
></span
>
</div>
</footer>
</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
210 changes: 210 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/help/WriteAdsDataNode.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>NecatiMeral - Hilfe - ComfortOnline Eingang</title>
<link rel="StyleSheet" href="default.css" type="text/css" />
</head>

<body>
<header>
<span id="headBlack">NecatiMeral Logikbausteine</span>
<span id="headGray">Hilfe</span>
</header>
<section>
<div class="contentholder">
<div class="navlinks-top"></div>
<h1>
<img src="../icons/noun-ventilation-3506887-44x44.png" alt="" />&nbsp;
ADS: Wert schreiben
</h1>
<h2>Inhaltsverzeichnis</h2>
<img
src="WriteAdsDataNode.png"
alt=""
class="description"
/>
<ul>
<li><a href="#description">Beschreibung</a></li>
<li><a href="#inputs">Eingänge</a></li>
<li><a href="#outputs">Ausgänge</a></li>
<li><a href="#related-links">Weiterführende Links</a></li>
</ul>
<h2 id="description">Beschreibung</h2>
<p>
Mit diesem Baustein kann man mithilfe des ADS-Protokolls (Automation Device Specification)
der Firma Beckhoff Daten in ein TwinCAT system schreiben.

Dieses System wird unter anderem in Wohnraumlüftungen der Firma Brötje verwendet.
</p>
<h2 id="inputs">Eingänge</h2>
<p>
Um Daten zu schreiben, muss der <c>Eingang</c>-Eingang
geschaltet werden. Weitere Eingänge sind:
</p>
<table class="Tabelle_Logicnode">
<colgroup>
<col style="width: 115px" />
<col style="width: 180px" />
<col />
</colgroup>
<tr>
<th>Bezeichnung</th>
<th>Porttyp</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>
<p><i>Eingang</i></p>
</td>
<td>
<p>Any</p>
</td>
<td>
<p>
Schreibt die angegebenen Daten entsprechend der Konfiguration
in das TwinCAT system. Der Typ des hier bereitgestellten Werts
muss mit dem <c>Datentyp</c>-Eingang übereinstimmen.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Remote-Adresse</i></p>
</td>
<td>
<p>Text</p>
</td>
<td>
<p>
Die Adresse des SOAP-API-Hosts.
</p>
</td>
</tr>
<tr>
<td>
<p><i>NET ID</i></p>
</td>
<td>
<p>Text</p>
</td>
<td>
<p>
Hiermit ist die AMS NET ID, oder auch die TwinCAT system ID gemeint.
</p>
<p>
Dies kann zum Beispiel wie folgt aufgebaut sein: `192.168.178.24.1.1`
</p>
</td>
</tr>
<tr>
<td>
<p><i>Port</i></p>
</td>
<td>
<p>Integer</p>
</td>
<td>
<p>
Portnummer. Die TwinCAT Geräte-ID.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Index-Gruppe</i></p>
</td>
<td>
<p>16-Bit Integer</p>
</td>
<td>
<p>
Index Group der Daten, die geschrieben werden sollen.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Index-Offset</i></p>
</td>
<td>
<p>16-Bit Integer</p>
</td>
<td>
<p>
Index Offset der Daten, die geschrieben werden sollen.
</p>
</td>
</tr>
<tr>
<td>
<p><i>Datentyp</i></p>
</td>
<td>
<p>Auswahl</p>
</td>
<td>
<p>
Der zu sendende Datentyp.
</p>
</td>
</tr>
</table>
<h2 id="outputs">Ausgänge</h2>
<table class="Tabelle_Logicnode">
<colgroup>
<col style="width: 115px" />
<col style="width: 180px" />
<col />
</colgroup>
<tr>
<th>Bezeichnung</th>
<th>Porttyp</th>
<th>Beschreibung</th>
</tr>
<tr>
<td>
<p><i>Diagnostics</i></p>
</td>
<td>
<p>Text</p>
</td>
<td>
<p>Im Fehlerfall: Detailinformationen zur Diagnose.</p>
</td>
</tr>
</table>
<h2 id="related-links">Weiterführende Links</h2>
<div class="row">
<ul>
<li>
<a href="https://www.plccoder.com/communicating-between-beckhoff-controllers-part-2-ads/">
PLCCoder.com: Communicating between Beckhoff controllers part 2: ADS
</a>
</li>
<li>
<a href="https://infosys.beckhoff.com/index.php?content=../content/1031/tcba/12269581963.html&id=8978321744740978019">
Beckhoff Information System: TS8040 | TwinCAT 2 Building Automation > Lüftungsanlagen
</a>
</li>
</ul>
</div>
</div>
</section>
<footer>
<div id="footerHead">
NecatiMeral Logikbausteine &nbsp;
<span style="color: #a0a0a0">Hilfe</span>
</div>
<div id="footerNav">
<span style="float: right"
><a
href="https://github.com/NecatiMeral/gira-x1-logic-nodes"
target="_blank"
>NecatiMeral / gira-x1-logic-nodes auf GitHub</a
></span
>
</div>
</footer>
</body>
</html>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
263 changes: 263 additions & 0 deletions dotnet/src/NecatiMeral.Logic.Ads/help/default.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
/* Simple Grid: https://simplegrid.io/ */
.container{margin-left:auto;margin-right:auto}.font-light{font-weight:300}.font-regular{font-weight:400}.font-heavy{font-weight:700}.left{text-align:left}.right{text-align:right}.center{text-align:center}.justify{text-align:justify}.container{width:90%}.row{position:relative;width:100%}.row [class^=col]{float:left;margin:.5rem 2%;min-height:.125rem}.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9{width:96%}.col-1-sm{width:4.33%}.col-2-sm{width:12.66%}.col-3-sm{width:21%}.col-4-sm{width:29.33%}.col-5-sm{width:37.66%}.col-6-sm{width:46%}.col-7-sm{width:54.33%}.col-8-sm{width:62.66%}.col-9-sm{width:71%}.col-10-sm{width:79.33%}.col-11-sm{width:87.66%}.col-12-sm{width:96%}.row::after{content:"";display:table;clear:both}.hidden-sm{display:none}@media only screen and (min-width:33.75em){.container{width:80%}}@media only screen and (min-width:45em){.col-1{width:4.33%}.col-2{width:12.66%}.col-3{width:21%}.col-4{width:29.33%}.col-5{width:37.66%}.col-6{width:46%}.col-7{width:54.33%}.col-8{width:62.66%}.col-9{width:71%}.col-10{width:79.33%}.col-11{width:87.66%}.col-12{width:96%}.hidden-sm{display:block}}@media only screen and (min-width:60em){.container{width:75%;max-width:60rem}}

/* General styling of html main parts*/
html {
color: #3C3C3C;
background-color: #e6e6e6;
font-family: Verdana;
font-size: 12px;
display: block;
line-height: 18px;
overflow-y: scroll;
-moz-hyphens: auto;
-epub-hyphens: auto;
-o-hyphens: auto;
-webkit-hyphens: auto;
-ms-hyphens: auto;
hyphens: auto;
}

.manhyphens {
-moz-hyphens: manual;
-epub-hyphens: manual;
-o-hyphens: manual;
-webkit-hyphens: manual;
-ms-hyphens: manual;
hyphens: manual;
}

body {
background-color: #ffffff;
width: 970px;
border: 0;
left: auto;
margin: 40px auto 40px auto;
}

header {
padding: 30px 35px 0 35px;
}

#headBlack {
font-family: Arial;
font-size: 36px;
font-weight: normal;
margin-bottom: 0;
padding: 0 36px 0 0;
}

#headGray {
font-family: Arial;
color: #a0a0a0;
font-size: 36px;
font-weight: normal;
margin-bottom: 0;
}

section {
padding: 10px 35px 30px 35px;
}

.contentholder {
width: 900px;
}

footer {
background-color: #f4f4f4;
padding: 30px 35px 30px 35px;
font-family: Arial;
}

#footerHead {
font-size: 18px;
}

#footerNav {
border-top: 1px solid #cccccc;
margin-top: 10px;
padding-top: 10px;
}

#footerNav img {
border: none;
vertical-align: middle;
width: 33px;
}

.navlinks-top {
float: right;
line-height: 42px;
font-weight: normal;
padding-right: 33px;
}

h1 {
font-family: Arial;
font-size: 36px;
line-height: 42px;
font-weight: normal;
color: #323232;
}

h2 {
font-family: Arial;
font-size: 18px;
line-height: 24px;
font-weight: normal;
color: #323232;
margin: 20px 0 5px 0;
padding: 8px 0 0 0;
}

h3 {
font-family: Arial;
font-size: 15px;
line-height: 20px;
margin: 6px 0 4px 0;
padding: 6px 0 0 0;
}

h4 {
font-family: Arial;
font-size: 13px;
line-height: 15px;
margin: 2px 0 4px 0;
padding: 2px 0 3px 0;
}

p {
margin: 8px 0 8px 0;
}

.box-noscroll {
width: 865px;
height: 19px;
border: 1px solid #CCC;
white-space: pre;
}

.box-scroll-x {
width: 865px;
height: 34px;
border: 1px solid #CCC;
white-space: pre;
overflow-x: scroll;
}

a {
color: #666;
display: inline;
}

a:hover {
color: #333;
}

ol,
ul {
padding: 0 0 0 20px;
margin: -4px 0 0 0;
}

li {
margin: 4px 0 4px 0;
}

dl {
padding: 0 0 0 20px;
margin: 0 0 0 0;
display: grid;
grid-template-columns: max-content auto;
}

dt {
grid-column-start: 1;
margin: 2px 0 0 0;
}

dd {
grid-column-start: 2;
margin: 2px 0 0 1.5em;
}

table {
border-collapse: collapse;
}

th,
td {
border-bottom: 1px solid #cccccc;
border-right: 1px solid #cccccc;
vertical-align: top;
}

th {
text-align: left;
padding: 0 4px 2px 4px;
}

td {
padding: 0 4px 0 4px;
}

table.Tabelle_Logicnode {
width: 100%;
max-width: 900px;
margin: 8px 0 8px 0;
}

table.Tabelle_Logicnode th {
font-family: Arial;
font-size: 15px;
line-height: 20px;
text-align: left;
vertical-align: baseline;
padding: 6px 4px 8px 4px;
border-bottom: 1px solid #cccccc;
border-right: none;
}

table.Tabelle_Logicnode th.small {
font-size: 13px;
line-height: 16px;
}

table.Tabelle_Logicnode td {
vertical-align: top;
padding: 0 4px 0 4px;
border-bottom: 1px solid #cccccc;
border-right: none;
}

table.Tabelle_Logicnode td.group {
border-bottom: none;
}

table.Tabelle_Logicnode td.group p {
margin: 6px 0 2px 0;
}

img {
border: none;
margin: 0 0 0 0;
vertical-align: middle;
}

.description {
border: none;
margin: 0 0 0 0;
padding: 3px 30px 40px 40px;
float: right;
}

.example {
border: none;
margin: 0 0 0 0;
padding-top: 6px;
max-width: 900px;
}

c {
font-family: 'Courier New', Courier, monospace;
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net45</TargetFramework>
@@ -13,12 +13,6 @@
</ItemGroup>

<ItemGroup>
<None Update="icons\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="help\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
@@ -28,12 +22,19 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>

<ItemGroup>
<None Update="Manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<None Update="icons\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="help\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

<ItemGroup>
<Reference Update="System.IO.Compression.FileSystem">
<IncludeAssets>all</IncludeAssets>
<Private>True</Private>
Original file line number Diff line number Diff line change
@@ -13,12 +13,6 @@
</ItemGroup>

<ItemGroup>
<None Update="icons\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="help\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
@@ -28,12 +22,19 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>

<ItemGroup>
<None Update="Manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<None Update="icons\*.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="help\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

<ItemGroup>
<Reference Update="System.IO.Compression.FileSystem">
<IncludeAssets>all</IncludeAssets>
<Private>True</Private>
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
106 changes: 106 additions & 0 deletions images/Noun-Project/noun-ventilation-3506887.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions images/Noun-Project/readme.md
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@

This project uses icons from the glorious noun project.


| Name | Attribution
|------|-------------
| `dictionary-2298128` | dictionary by Berkah Icon from [Noun Project](https://thenounproject.com/browse/icons/term/dictionary/)
| `dictionary-2298128` | dictionary by [Berkah Icon](https://thenounproject.com/berkahicon/) from [Noun Project](https://thenounproject.com/browse/icons/term/dictionary/)
| `noun-ventilation-3506887` | dictionary by [IconMark](https://thenounproject.com/iconmark/) from [Noun Project](https://thenounproject.com/icon/ventilation-3506887/)

0 comments on commit d61d175

Please sign in to comment.