Showing preview only (944K chars total). Download the full file or copy to clipboard to get everything.
Repository: mathiask88/node-snap7
Branch: master
Commit: 1b15218c7a2b
Files: 51
Total size: 913.2 KB
Directory structure:
gitextract_8115zplp/
├── .github/
│ └── workflows/
│ └── test-and-release.yml
├── .gitignore
├── .npmignore
├── LICENSE
├── README.md
├── binding.gyp
├── deps/
│ └── snap7/
│ ├── HISTORY.txt
│ ├── gpl.txt
│ ├── lgpl-3.0.txt
│ └── src/
│ ├── core/
│ │ ├── s7_client.cpp
│ │ ├── s7_client.h
│ │ ├── s7_firmware.h
│ │ ├── s7_isotcp.cpp
│ │ ├── s7_isotcp.h
│ │ ├── s7_micro_client.cpp
│ │ ├── s7_micro_client.h
│ │ ├── s7_partner.cpp
│ │ ├── s7_partner.h
│ │ ├── s7_peer.cpp
│ │ ├── s7_peer.h
│ │ ├── s7_server.cpp
│ │ ├── s7_server.h
│ │ ├── s7_text.cpp
│ │ ├── s7_text.h
│ │ └── s7_types.h
│ ├── lib/
│ │ ├── snap7.def
│ │ ├── snap7_libmain.cpp
│ │ └── snap7_libmain.h
│ └── sys/
│ ├── snap_msgsock.cpp
│ ├── snap_msgsock.h
│ ├── snap_platform.h
│ ├── snap_sysutils.cpp
│ ├── snap_sysutils.h
│ ├── snap_tcpsrvr.cpp
│ ├── snap_tcpsrvr.h
│ ├── snap_threads.cpp
│ ├── snap_threads.h
│ ├── sol_threads.h
│ ├── unix_threads.h
│ └── win_threads.h
├── doc/
│ ├── client.md
│ └── server.md
├── lib/
│ └── node-snap7.js
├── package.json
└── src/
├── node_snap7.cpp
├── node_snap7_client.cpp
├── node_snap7_client.h
├── node_snap7_server.cpp
├── node_snap7_server.h
├── snap7.cpp
└── snap7.h
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/test-and-release.yml
================================================
name: Test and Release
on: [push, pull_request, workflow_dispatch]
permissions:
contents: read
jobs:
build:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
node: [16, 18, 20, 22, 24]
arch: [x86, x64]
exclude:
- { os: ubuntu-latest, arch: x86 }
- { os: macos-latest, arch: x86 }
- { os: windows-latest, arch: x86, node: 24 }
runs-on: ${{ matrix.os }}
name: ${{ matrix.os }} / Node ${{ matrix.node }} ${{ matrix.arch }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 2
# Force Python to 3.10 until prebuild updates to node-gyp 10
- name: Use Python 3.10
if: ${{ matrix.os != 'windows-latest' }}
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Use node ${{ matrix.node }} ${{ matrix.arch }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
architecture: ${{ matrix.arch }}
- name: Install
run: npm install
- name: Test
env:
PREBUILD_TOKEN: ${{ secrets.PREBUILD_TOKEN }}
run: npm test
================================================
FILE: .gitignore
================================================
.vscode/
build/
node_modules/
test/
================================================
FILE: .npmignore
================================================
test/
.travis.yml
appveyor.yml
.npmignore
.gitignore
================================================
FILE: LICENSE
================================================
(The MIT License)
Copyright (c) 2019 Mathias Küsel
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: README.md
================================================
# node-snap7
[](https://www.npmjs.com/package/node-snap7)
[](https://www.npmjs.com/package/node-snap7)
[](https://github.com/mathiask88/node-snap7/actions/workflows/test-and-release.yml)
[](https://www.npmjs.com/package/node-snap7)
**Current node-snap7 version:** 1.0.9\
**Current snap7 version:** 1.4.2
**In my spare time I am working on a [node-addon-api](https://github.com/nodejs/node-addon-api) rewrite and want to switch from [prebuild-install](https://github.com/prebuild/prebuild-install) to [prebuildify](https://github.com/prebuild/prebuildify).\
The current S7Server implementation has some bugs, please use with caution.**
## About
This is a node.js wrapper for snap7. Snap7 is an open source, 32/64 bit, multi-platform Ethernet communication suite for interfacing natively with Siemens S7 PLCs (See [compatibility](http://snap7.sourceforge.net/snap7_client.html#target_compatibility)).
## Installation
Install with:
npm install node-snap7
node-snap7 uses `prebuild` and `prebuild-install` for handling prebuilt binaries. See [this list](https://github.com/mathiask88/node-snap7/releases) of supported prebuilt platform binaries. When installing node-snap7 `prebuild-install` will install prebuilt binaries from GitHub if they exist and fallback to a compile step if they don't.
If you don't want to use the `prebuild` for the platform you are installing on, specify the `--build-from-source` flag when you install.
For building from source you need the following requirements:
- Windows:
- [Visual Studio 2013 Express or higher](https://www.visualstudio.com/de/vs/visual-studio-express/)
- [Python 2.7](https://www.python.org/downloads/release/python-2714/)
- Linux:
- C++11 toolchain
- [Python 2.7](https://www.python.org/downloads/release/python-2714/)
## Special thanks to
- Davide Nardella for creating snap7
## How to use
### API
- [Client](doc/client.md)
- [Server](doc/server.md)
### Client Example
```javascript
var snap7 = require('node-snap7');
var s7client = new snap7.S7Client();
s7client.ConnectTo('192.168.1.12', 0, 1, function(err) {
if(err)
return console.log(' >> Connection failed. Code #' + err + ' - ' + s7client.ErrorText(err));
// Read the first byte from PLC process outputs...
s7client.ABRead(0, 1, function(err, res) {
if(err)
return console.log(' >> ABRead failed. Code #' + err + ' - ' + s7client.ErrorText(err));
// ... and write it to stdout
console.log(res)
});
});
```
### Server Example
```javascript
var snap7 = require('node-snap7');
var s7server = new snap7.S7Server();
// Set up event listener
s7server.on("event", function(event) {
console.log(s7server.EventText(event));
});
// Create a new Buffer and register it to the server as DB1
var db1 = new Buffer(100).fill('ÿ');
s7server.RegisterArea(s7server.srvAreaDB, 1, db1);
// Start the server
s7server.StartTo('127.0.0.1');
// Close the server after 20s in this example
setTimeout(function() {
s7server.Stop();
s7server.UnregisterArea(s7server.srvAreaDB, 1);
}, 20000);
```
Have a look at the resourceless server example [here](doc/server.md#event-read-write).
## License & copyright
Copyright (c) 2019, Mathias Küsel
node-snap7 is licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.
node-snap7 builds on the excellent work of the snap7 framework from Davide Nardella. Snap7 is issued under the GPL/LGPLv3 (see `./deps/snap7/gpl.txt ./deps/snap7/lgpl-3.0.txt`).
================================================
FILE: binding.gyp
================================================
{
"targets": [{
"target_name": "node_snap7",
"include_dirs": [
"<!(node -e \"require('nan')\")",
"./src"
],
"sources": [
"./src/node_snap7.cpp",
"./src/node_snap7_client.cpp",
"./src/node_snap7_server.cpp",
"./src/snap7.cpp"
],
"conditions": [
["OS=='win'", {
"libraries": ["-lws2_32.lib", "-lwinmm.lib"],
"defines": ["_WINSOCK_DEPRECATED_NO_WARNINGS", "_HAS_EXCEPTIONS=0"] # Make sure the STL doesn't try to use exceptions
}]
],
"dependencies": [
"snap7"
]
}, {
"target_name": "snap7",
"type": "static_library",
"include_dirs": [
"./deps/snap7/src/sys",
"./deps/snap7/src/core",
"./deps/snap7/src/lib"
],
"sources": [
"./deps/snap7/src/sys/snap_msgsock.cpp",
"./deps/snap7/src/sys/snap_sysutils.cpp",
"./deps/snap7/src/sys/snap_tcpsrvr.cpp",
"./deps/snap7/src/sys/snap_threads.cpp",
"./deps/snap7/src/core/s7_client.cpp",
"./deps/snap7/src/core/s7_isotcp.cpp",
"./deps/snap7/src/core/s7_partner.cpp",
"./deps/snap7/src/core/s7_peer.cpp",
"./deps/snap7/src/core/s7_server.cpp",
"./deps/snap7/src/core/s7_text.cpp",
"./deps/snap7/src/core/s7_micro_client.cpp",
"./deps/snap7/src/lib/snap7_libmain.cpp"
],
"conditions": [
["OS=='linux' or OS=='freebsd'", {
"cflags_cc": ["-fPIC", "-pedantic", "-fexceptions"],
"cflags_cc!": ["-fno-exceptions"]
}],
["OS=='win'", {
"msvs_settings": {
"VCCLCompilerTool": {
"ExceptionHandling": 1,
"AdditionalOptions": ["/EHsc"] # ExceptionHandling=1 is not enough for some versions
}
},
"defines!": ["_HAS_EXCEPTIONS=0"],
"defines": ["_WINSOCK_DEPRECATED_NO_WARNINGS"]
}],
["OS=='mac'", {
"xcode_settings": {
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
"GCC_DYNAMIC_NO_PIC": "NO",
"OTHER_CFLAGS": ["-pedantic"]
}
}]
]
}],
'variables' : {
'openssl_fips': '',
}
}
================================================
FILE: deps/snap7/HISTORY.txt
================================================
======================================================================[2015-06-14]
Version 1.4.0 - release for gourmets (fully compatible with 1.0.0)
----------------------------------------------------------------------------------
- Resourceless Server
- Utility added
- Improved .NET wrapper
- New .NET Demos
- Solution also for .NET Console demos
- Small bugfix
[Added]
- Resourceless server
Now Snap7Server can work in "resourceless" mode, i.e. you dont need to share
resources (DB, E, A) with it : On every read/write request a callback is
called passing it the TAG (Type of memory E,A,DB..,DB number if any, Start,
Size, WordLen), and a pointer to the internal server area to read/write your
data on demand.
The 1.4.0 wrappers were updated to reflect this new mode and I wrote some
examples on how to use this feature, that however is very simple.
Purpose:
- Protocol converters.
- HMI Analyzers.
- Flow Splitters/Routers.
- Utility
There is a new folder that contains some interesting (I hope) utilities.
They are demo programs with a "real purpose".
The first is HMITracer, a program that shows how use the new resourceless
server. It simulates a PLC and lists all Tags referenced by an external HMI.
A detailed PDF report is generated also.
[Improved]
- Improved .NET wrapper
Now the S7 Helper class can convert *ALL* S7 types, including the new
S71200/1500 64 bit types :
- 8, 16, 32, 64 bit signed and unsigned values.
- Long real (64 bit)
- Long Date/Time, Long Time of Day
- Added the class S7MultiVars which greatly simplifies the reading and writing of
MultiVars.
- New .NET Demos
Added WinForm Server Demo and MultiRead vars Demo.
Added 64 platform for all demos
Added the compilation of Snap7.net.cs for VB demos.
- Solution also for .NET Console demos
A VS2013 solution for .NET console demos was added.
you no longer need the of the batch file to build the demos.
- Reduced the memory footprint of Snap7Server (there was an unused memory block).
[Fixed]
- (Only Windows) If an attacker gains control of the application directory, he
could force the application to load a malicious copy of iphlpapi.dll (which
is used for ping).
Now iphlpapi.dll is loaded from the Windows system directory.
Thanks to the Security engineer Alexandre CHERON for reporting it.
======================================================================[2015-01-01]
Version 1.3.0 - Platform / Comfort release (fully compatible with 1.0.0)
----------------------------------------------------------------------------------
Platform
- Runtime Big-Endian architecture support. No compilers swithes are needed.
- Sun Sparc and Mips BE architectures are now supported.
- Arduino YUN
Comfort
- Added WinForm.net demos (C# and VB)
- Improved documentation (added .NET chapter for beginners *please read it*)
Added also a chapter about Siemens data format.
- Added Helper class/functions
==================================================================================
[Added]
- Helper class/function to insert/extract S7 typed vars from a byte[] buffer.
You will find them into the wrappers (.net/Pascal/C++)
- Solaris Sparc support
(Thanks to Rolf Stalder for makefiles)
- Arduino YUN support
(Thanks to Fulvio Bosco and Stefano Bonnin)
- .Net Winform small demos
- .Net solution for rebuilding snap7.net.cs
[Improved]
- Unix, now the client doesn't need root priviledges to perform the SmartConnect.
(Thanks to Rolf Stalder)
- Solaris now uses standard pthreads.
(Thanks to Rolf Stalder)
- Read/WriteMultiVars now checks in advance if the data fits into the PDU size.
- .net S7Client.ReadMultivars (and Write) was improved.
(Thanks to LanceL who made it)
- S7Client now checks if it's connected before do anything.
(Thanks to Mathias Ksel for reporting it)
[Latest OS]
- Tested with Ubuntu 14.10 (32/64)
- Tested with Windows 10 Technical Preview (32/64)
[fixed]
- Fixed some Typo errors into snap7.net.cs
- Fixed a small bug into Read/WriteMultiVars
======================================================================[2014-04-17]
Version 1.2.1 - Bugfix/Small changes release (fully compatible with 1.0.0)
----------------------------------------------------------------------------------
- Some small Apple Mac OSX changes (Tested under OSX 10.9.1 Mavericks)
- Some bug fixed
- Documentation updated.
- Some OLD/RARELY USED libraries are not longer deployed.
but *THEY ARE STILL TESTED AND SUPPORTED*
If you don't have the way to rebuild Snap7 in these platforms please contact me
and I will try to help you.
They are :
- Linux i386/x86_64 GLIBC 2.11 up to 2.15
- Linux ARMHF BeagleBone Black, CubieBoard 2, PcDuino.
- A new Linux distro is supported (Ubuntu 14.04 LTS and derivatives GLIBC 2.19)
- Old Windows Platforms are still fully supported but you will find them into
\release\windows\Legacy\Win32 and Win64.
This because many people had problems with .NET environment (which doesn't like
non-Microsoft Libraries on some platforms), so the official Windows libraries are
now compiled with Visual Studio.
If you plan to use MinGW64, use Legacy libraries (wich work fine up to Windows 8).
==================================================================================
[Changed]
- Unix, now it's possible to specify the destination folder of the library using the
optional param LibInstall=<NewPath> into the make command line. If not specified
the default path is /usr/lib.
(thanks to Gijs Molenaar)
- Apple OSX, now the library suffix is .dylib instead of .so
however it's possible override the suffix using the LibExt param (see doc.)
(thanks to Gijs Molenaar)
[fixed]
- Fixed a typo error into snap7.net.cs (Cli_GetPlcStatus)
(Thanks to Dabbadoeber for reporting)
- Fixed a bug into s7_micro_client.cpp into block download function.
(Thanks to Mark Konst for reporting)
- fixed a bug into s7_partner.cpp (issues for transfers>PDU size)
(Thanks to Volker Sarnes)
- fixed a bug into s7_server.cpp (wrong bit access)
(Thanks to Thomas Costa)
- little modification to client.cs and ppartner.cs to be compiled with VS2008 which
doesn't handle the constant (default) parameter in a method declaration.
(thanks to Max Schaetzel for reporting)
======================================================================[2014-01-01]
Version 1.2.0 - New Minor platform release (fully compatible with 1.0.0)
----------------------------------------------------------------------------------
- Apple Mac OSX support (Tested under OSX 10.9.1 Mavericks)
- Some bug fixed
- Documentation improved and updated.
==================================================================================
[Added]
- Apple OSX full support :
makefiles, source examples, binary library and binary demos supplied.
new osx folders added in the entire project.
[fixed]
- S7API directive missing for two functions in snap7_libmain.h
(Thanks to Mathias Ksel for reporting)
- fixed Snap7.S7Server.Srv_RegisterArea in snap7.net.cs
(Thanks to Andr for reporting).
- Added a static var to contain the callback addresses into c# examples.
The .net garbage collector *sometime* garbages the delegates (called by unmanaged
code) if their address is not stored into a static var.
MS says that it's not a clr bug (maybe a feature ????)
However this solves the problem.
PLEASE SEE THE .NET EXAMPLES IF YOU PLAN TO USE SNAP7 (or other unmanaged)
CALLBACKS.
(Thanks to Martin Bratt for reporting).
- Srv_SetReadEventsCallback prototype missing in Snap7.pas
======================================================================[2013-11-10]
Version 1.1.0 - New Minor hardware release (fully compatible with 1.0.0)
----------------------------------------------------------------------------------
- LOGO 0BA7 Ethernet support (as client/server and Network I/O blocks)
- S7200 (via CP243) experimental support
- New Callback for S7Server that allow writing full synchronous gateways (protocol
translators)
- New rich-demos
- Some bug fixed
- Documentation improved and updated.
==================================================================================
[Added]
- Cli_GetConnected function added.
It returns the connection status of the client.
- Cli_SetConnectionType function added.
For a Client it's possible to connect to a PLC as PG/OP/S7 Basic.
- Cli_SetConnectionParams function added.
For a Client now it's possible to specifying Local and Remote TSAP before the
connection.
Needed for LOGO, S7200 and future hardware compatible with S7Protocol.
- Srv_SetReadEventsCallback function added.
It allows to trap the read event from a client *before* the data getting.
- New ClientDemo and ServerDemo for the latter functions were supplied.
- LOGO examples were supplied.
- New rich-demos for Cubieboard 2 (under Cubian OS)
- Glibc_2.11 for Linux x86_64 Release
- Full documentation updated.
[Fixed]
- Expression bug in line 491 of /examples/pascal/client.dpr
"if ParamCount=4" must be "if ParamCount=3"
(thanks to Jean-Noel Voirol)
- Bug in S7Worker (Snap7Server) that returned "Data mismatch" error in MultiWrite
function when writing ODD amount of bytes in items with index>1
- Bug in TSAP calculation in S7Client connection that sent wrong connection
telegram to S7400 when the CPU was in Rack>1
(thanks to hujingqi for the detailed analysis)
======================================================================[2013-09-03]
Version 1.0.0
==================================================================================
- First public release.
==================================================================================
================================================
FILE: deps/snap7/gpl.txt
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: deps/snap7/lgpl-3.0.txt
================================================
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
================================================
FILE: deps/snap7/src/core/s7_client.cpp
================================================
/*=============================================================================|
| PROJECT SNAP7 1.3.0 |
|==============================================================================|
| Copyright (C) 2013, 2015 Davide Nardella |
| All rights reserved. |
|==============================================================================|
| SNAP7 is free software: you can redistribute it and/or modify |
| it under the terms of the Lesser GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| It means that you can distribute your commercial software linked with |
| SNAP7 without the requirement to distribute the source code of your |
| application and without the requirement that your application be itself |
| distributed under LGPL. |
| |
| SNAP7 is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| Lesser GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License and a |
| copy of Lesser GNU General Public License along with Snap7. |
| If not, see http://www.gnu.org/licenses/ |
|=============================================================================*/
#include "s7_client.h"
//---------------------------------------------------------------------------
TSnap7Client::TSnap7Client()
{
FThread = 0;
CliCompletion = 0;
EvtJob = NULL;
EvtComplete = NULL;
FThread=NULL;
ThreadCreated = false;
}
//---------------------------------------------------------------------------
TSnap7Client::~TSnap7Client()
{
Destroying=true;
Disconnect();
CliCompletion=NULL;
if (ThreadCreated)
{
CloseThread();
delete EvtComplete;
delete EvtJob;
ThreadCreated=false;
}
}
//---------------------------------------------------------------------------
void TSnap7Client::CloseThread()
{
int Timeout;
if (FThread)
{
FThread->Terminate();
if (Job.Pending)
Timeout=3000;
else
Timeout=1000;
EvtJob->Set();
if (FThread->WaitFor(Timeout)!=WAIT_OBJECT_0)
FThread->Kill();
try {
delete FThread;
}
catch (...){
}
FThread=0;
}
}
//---------------------------------------------------------------------------
void TSnap7Client::OpenThread()
{
FThread = new TClientThread(this);
FThread->Start();
}
//---------------------------------------------------------------------------
int TSnap7Client::Reset(bool DoReconnect)
{
bool WasConnected = Connected;
if (ThreadCreated)
{
CloseThread();
Disconnect();
OpenThread();
}
else
Disconnect();
if (DoReconnect || WasConnected)
return Connect();
else
return 0;
}
//---------------------------------------------------------------------------
void TSnap7Client::DoCompletion()
{
if ((CliCompletion!=NULL) && !Destroying)
{
try{
CliCompletion(FUsrPtr, Job.Op, Job.Result);
}catch (...)
{
}
}
}
//---------------------------------------------------------------------------
int TSnap7Client::SetAsCallback(pfn_CliCompletion pCompletion, void * usrPtr)
{
CliCompletion=pCompletion;
FUsrPtr=usrPtr;
return 0;
}
//---------------------------------------------------------------------------
int TSnap7Client::GetParam(int ParamNumber, void * pValue)
{
// Actually there are no specific client params, maybe in future...
return TSnap7MicroClient::GetParam(ParamNumber, pValue);
}
//---------------------------------------------------------------------------
int TSnap7Client::SetParam(int ParamNumber, void * pValue)
{
// Actually there are no specific client params, maybe in future...
return TSnap7MicroClient::SetParam(ParamNumber, pValue);
}
//---------------------------------------------------------------------------
bool TSnap7Client::CheckAsCompletion(int &opResult)
{
if (!Job.Pending)
opResult=Job.Result;
else
if (!Destroying)
opResult=errCliJobPending; // don't set LastError here
else
{
opResult=errCliDestroying;
return true;
}
return !Job.Pending;
}
//---------------------------------------------------------------------------
int TSnap7Client::AsReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void * pUsrData)
{
if (!Job.Pending)
{
Job.Pending = true;
Job.Op = s7opReadArea;
Job.Area = Area;
Job.Number = DBNumber;
Job.Start = Start;
Job.Amount = Amount;
Job.WordLen = WordLen;
Job.pData = pUsrData;
JobStart = SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsWriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void * pUsrData)
{
int ByteSize, TotalSize;
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opWriteArea;
Job.Area =Area;
Job.Number =DBNumber;
Job.Start =Start;
// Performs some check first to copy the data
ByteSize=DataSizeByte(WordLen);
TotalSize=ByteSize*Amount; // Total size in bytes
if (ByteSize==0)
return SetError(errCliInvalidWordLen);
if ((TotalSize < 1) || (TotalSize > int(sizeof(opData))))
return SetError(errCliInvalidParams);
Job.Amount =Amount;
Job.WordLen =WordLen;
// Doublebuffering
memcpy(&opData, pUsrData, TotalSize);
Job.pData =&opData;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsListBlocksOfType(int BlockType, PS7BlocksOfType pUsrData, int & ItemsCount)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opListBlocksOfType;
Job.Area =BlockType;
Job.pData =pUsrData;
Job.pAmount =&ItemsCount;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsReadSZL(int ID, int Index, PS7SZL pUsrData, int & Size)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opReadSZL;
Job.ID =ID;
Job.Index =Index;
Job.pData =pUsrData;
Job.pAmount =&Size;
Job.Amount =Size;
Job.IParam =1; // Data has to be copied into user buffer
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsReadSZLList(PS7SZLList pUsrData, int &ItemsCount)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opReadSzlList;
Job.pData =pUsrData;
Job.pAmount =&ItemsCount;
Job.Amount =ItemsCount;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsUpload(int BlockType, int BlockNum, void * pUsrData, int & Size)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opUpload;
Job.Area =BlockType;
Job.pData =pUsrData;
Job.pAmount =&Size;
Job.Amount =Size;
Job.Number =BlockNum;
Job.IParam =0; // not full upload, only data
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsFullUpload(int BlockType, int BlockNum, void * pUsrData, int & Size)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opUpload;
Job.Area =BlockType;
Job.pData =pUsrData;
Job.pAmount =&Size;
Job.Amount =Size;
Job.Number =BlockNum;
Job.IParam =1; // full upload
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsDownload(int BlockNum, void * pUsrData, int Size)
{
if (!Job.Pending)
{
// Checks the size : here we only need a size>0 to avoid problems during
// doublebuffering, the real test of the block size will be done in
// Checkblock.
if (Size<1)
return SetError(errCliInvalidBlockSize);
Job.Pending =true;
Job.Op =s7opDownload;
// Doublebuffering
memcpy(&opData, pUsrData, Size);
Job.Number =BlockNum;
Job.Amount =Size;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsCopyRamToRom(int Timeout)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opCopyRamToRom;
if (Timeout>0)
{
Job.IParam =Timeout;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliInvalidParams);
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsCompress(int Timeout)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opCompress;
if (Timeout>0)
{
Job.IParam =Timeout;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliInvalidParams);
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsDBRead(int DBNumber, int Start, int Size, void * pUsrData)
{
return AsReadArea(S7AreaDB, DBNumber, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsDBWrite(int DBNumber, int Start, int Size, void * pUsrData)
{
return AsWriteArea(S7AreaDB, DBNumber, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsMBRead(int Start, int Size, void * pUsrData)
{
return AsReadArea(S7AreaMK, 0, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsMBWrite(int Start, int Size, void * pUsrData)
{
return AsWriteArea(S7AreaMK, 0, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsEBRead(int Start, int Size, void * pUsrData)
{
return AsReadArea(S7AreaPE, 0, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsEBWrite(int Start, int Size, void * pUsrData)
{
return AsWriteArea(S7AreaPE, 0, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsABRead(int Start, int Size, void * pUsrData)
{
return AsReadArea(S7AreaPA, 0, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsABWrite(int Start, int Size, void * pUsrData)
{
return AsWriteArea(S7AreaPA, 0, Start, Size, S7WLByte, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsTMRead(int Start, int Amount, void * pUsrData)
{
return AsReadArea(S7AreaTM, 0, Start, Amount, S7WLTimer, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsTMWrite(int Start, int Amount, void * pUsrData)
{
return AsWriteArea(S7AreaTM, 0, Start, Amount, S7WLTimer, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsCTRead(int Start, int Amount, void * pUsrData)
{
return AsReadArea(S7AreaCT, 0, Start, Amount, S7WLCounter, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsCTWrite(int Start, int Amount, void * pUsrData)
{
return AsWriteArea(S7AreaCT, 0, Start, Amount, S7WLCounter, pUsrData);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsDBGet(int DBNumber, void * pUsrData, int &Size)
{
if (!Job.Pending)
{
if (Size<=0)
return SetError(errCliInvalidBlockSize);
Job.Pending =true;
Job.Op =s7opDBGet;
Job.Number =DBNumber;
Job.pData =pUsrData;
Job.pAmount =&Size;
Job.Amount =Size;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
int TSnap7Client::AsDBFill(int DBNumber, int FillChar)
{
if (!Job.Pending)
{
Job.Pending =true;
Job.Op =s7opDBFill;
Job.Number =DBNumber;
Job.IParam =FillChar;
JobStart =SysGetTick();
StartAsyncJob();
return 0;
}
else
return SetError(errCliJobPending);
}
//---------------------------------------------------------------------------
void TSnap7Client::StartAsyncJob()
{
ClrError();
if (!ThreadCreated)
{
EvtJob = new TSnapEvent(false);
EvtComplete = new TSnapEvent(false);
OpenThread();
ThreadCreated=true;
}
EvtComplete->Reset(); // reset if previously was not called WaitAsCompletion
EvtJob->Set();
}
//---------------------------------------------------------------------------
int TSnap7Client::WaitAsCompletion(unsigned long Timeout)
{
if (Job.Pending)
{
if (ThreadCreated)
{
if (EvtComplete->WaitFor(Timeout)==WAIT_OBJECT_0)
return Job.Result;
else
{
if (Destroying)
return errCliDestroying;
else
return SetError(errCliJobTimeout);
}
}
else
return SetError(errCliJobTimeout);
}
else
return Job.Result;
}
//---------------------------------------------------------------------------
void TClientThread::Execute()
{
while (!Terminated)
{
FClient->EvtJob->WaitForever();
if (!Terminated)
{
FClient->PerformOperation();
FClient->EvtComplete->Set();
// Notify the caller the end of job (if callback is set)
FClient->DoCompletion();
}
};
}
================================================
FILE: deps/snap7/src/core/s7_client.h
================================================
/*=============================================================================|
| PROJECT SNAP7 1.3.0 |
|==============================================================================|
| Copyright (C) 2013, 2015 Davide Nardella |
| All rights reserved. |
|==============================================================================|
| SNAP7 is free software: you can redistribute it and/or modify |
| it under the terms of the Lesser GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| It means that you can distribute your commercial software linked with |
| SNAP7 without the requirement to distribute the source code of your |
| application and without the requirement that your application be itself |
| distributed under LGPL. |
| |
| SNAP7 is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| Lesser GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License and a |
| copy of Lesser GNU General Public License along with Snap7. |
| If not, see http://www.gnu.org/licenses/ |
|=============================================================================*/
#ifndef s7_client_h
#define s7_client_h
//---------------------------------------------------------------------------
#include "snap_threads.h"
#include "s7_micro_client.h"
//---------------------------------------------------------------------------
extern "C" {
typedef void (S7API *pfn_CliCompletion) (void * usrPtr, int opCode, int opResult);
}
class TSnap7Client;
class TClientThread: public TSnapThread
{
private:
TSnap7Client * FClient;
public:
TClientThread(TSnap7Client *Client)
{
FClient = Client;
}
void Execute();
};
//---------------------------------------------------------------------------
class TSnap7Client: public TSnap7MicroClient
{
private:
TClientThread *FThread;
bool ThreadCreated;
void CloseThread();
void OpenThread();
void StartAsyncJob();
protected:
PSnapEvent EvtJob;
PSnapEvent EvtComplete;
pfn_CliCompletion CliCompletion;
void *FUsrPtr;
void DoCompletion();
public:
friend class TClientThread;
TSnap7Client();
~TSnap7Client();
int Reset(bool DoReconnect);
int SetAsCallback(pfn_CliCompletion pCompletion, void * usrPtr);
int GetParam(int ParamNumber, void *pValue);
int SetParam(int ParamNumber, void *pValue);
// Async functions
bool CheckAsCompletion( int & opResult);
int WaitAsCompletion(unsigned long Timeout);
int AsReadArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void * pUsrData);
int AsWriteArea(int Area, int DBNumber, int Start, int Amount, int WordLen, void * pUsrData);
int AsListBlocksOfType(int BlockType, PS7BlocksOfType pUsrData, int & ItemsCount);
int AsReadSZL(int ID, int Index, PS7SZL pUsrData, int & Size);
int AsReadSZLList(PS7SZLList pUsrData, int &ItemsCount);
int AsUpload(int BlockType, int BlockNum, void * pUsrData, int & Size);
int AsFullUpload(int BlockType, int BlockNum, void * pUsrData, int & Size);
int AsDownload(int BlockNum, void * pUsrData, int Size);
int AsCopyRamToRom(int Timeout);
int AsCompress(int Timeout);
int AsDBRead(int DBNumber, int Start, int Size, void * pUsrData);
int AsDBWrite(int DBNumber, int Start, int Size, void * pUsrData);
int AsMBRead(int Start, int Size, void * pUsrData);
int AsMBWrite(int Start, int Size, void * pUsrData);
int AsEBRead(int Start, int Size, void * pUsrData);
int AsEBWrite(int Start, int Size, void * pUsrData);
int AsABRead(int Start, int Size, void * pUsrData);
int AsABWrite(int Start, int Size, void * pUsrData);
int AsTMRead(int Start, int Amount, void * pUsrData);
int AsTMWrite(int Start, int Amount, void * pUsrData);
int AsCTRead(int Start, int Amount, void * pUsrData);
int AsCTWrite(int Start, int Amount, void * pUsrData);
int AsDBGet(int DBNumber, void * pUsrData, int & Size);
int AsDBFill(int DBNumber, int FillChar);
};
typedef TSnap7Client *PSnap7Client;
//---------------------------------------------------------------------------
#endif // s7_client_h
================================================
FILE: deps/snap7/src/core/s7_firmware.h
================================================
/*=============================================================================|
| PROJECT SNAP7 1.3.0 |
|==============================================================================|
| Copyright (C) 2013, 2015 Davide Nardella |
| All rights reserved. |
|==============================================================================|
| SNAP7 is free software: you can redistribute it and/or modify |
| it under the terms of the Lesser GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| It means that you can distribute your commercial software linked with |
| SNAP7 without the requirement to distribute the source code of your |
| application and without the requirement that your application be itself |
| distributed under LGPL. |
| |
| SNAP7 is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| Lesser GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License and a |
| copy of Lesser GNU General Public License along with Snap7. |
| If not, see http://www.gnu.org/licenses/ |
|=============================================================================*/
#ifndef s7_firmware_h
#define s7_firmware_h
//---------------------------------------------------------------------------
#include "snap_platform.h"
//******************************************************************************
// CPU DATABANK
//******************************************************************************
byte SZLNotAvail[4] = {
0x0A,0x00,0x00,0x00
};
byte SZLSysState[6] = {
0xFF,0x09,0x00,0x02,0x02,0x00
};
byte SZL_ID_0000_IDX_XXXX[236] = {
0xFF,0x09,0x00,0xE8,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x00,0x0F,0x00,0x00,0x02,0x00,
0x11,0x01,0x11,0x0F,0x11,0x00,0x12,0x01,0x12,0x0F,0x12,0x00,0x13,0x01,0x13,0x00,0x14,0x0F,0x14,
0x00,0x15,0x01,0x15,0x00,0x17,0x01,0x17,0x0F,0x17,0x00,0x18,0x01,0x18,0x0F,0x18,0x00,0x19,0x0F,
0x19,0x00,0x1A,0x0F,0x1A,0x00,0x1B,0x0F,0x1B,0x00,0x1C,0x01,0x1C,0x0F,0x1C,0x00,0x21,0x0A,0x21,
0x0F,0x21,0x02,0x22,0x00,0x23,0x0F,0x23,0x00,0x24,0x01,0x24,0x04,0x24,0x05,0x24,0x00,0x25,0x01,
0x25,0x02,0x25,0x0F,0x25,0x01,0x31,0x01,0x32,0x02,0x32,0x00,0x36,0x01,0x36,0x0F,0x36,0x00,0x37,
0x01,0x37,0x0F,0x37,0x00,0x38,0x01,0x38,0x02,0x38,0x0F,0x38,0x01,0x39,0x00,0x3A,0x0F,0x3A,0x00,
0x74,0x01,0x74,0x0F,0x74,0x05,0x91,0x0A,0x91,0x0C,0x91,0x0D,0x91,0x00,0x92,0x02,0x92,0x06,0x92,
0x0F,0x92,0x00,0x94,0x01,0x94,0x02,0x94,0x06,0x94,0x07,0x94,0x0F,0x94,0x00,0x95,0x01,0x95,0x0F,
0x95,0x06,0x96,0x0C,0x96,0x0C,0x97,0x0D,0x97,0x01,0x9A,0x02,0x9A,0x0F,0x9A,0x0C,0x9B,0x00,0x9C,
0x01,0x9C,0x02,0x9C,0x03,0x9C,0x0F,0x9C,0x00,0xA0,0x01,0xA0,0x0F,0xA0,0x00,0xB1,0x00,0xB2,0x00,
0xB3,0x00,0xB4,0x01,0xB5,0x02,0xB5,0x03,0xB5,0x04,0xB5,0x05,0xB5,0x06,0xB5,0x07,0xB5,0x08,0xB5,
0x01,0xB6,0x02,0xB6,0x03,0xB6,0x04,0xB6
};
byte SZL_ID_0F00_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x00,0x00,0x00,0x00,0x02,0x00,0x70
};
byte SZL_ID_0002_IDX_XXXX[458] = { // <--Wrapped to 458 bytes
0xFF,0x09,0x01,0xC6,0x00,0x02,0x00,0x00,0x00,0x08,0x00,0x71,0x01,0xAC,0x00,0x01,0x00,0x28,0x00,
0x1C,0x01,0xAC,0x24,0x00,0x00,0x24,0x00,0x00,0x01,0xAC,0x23,0x00,0x00,0x06,0x04,0xB0,0x01,0xAC,
0x22,0x00,0x00,0x08,0x00,0x01,0x01,0xAC,0x31,0x00,0x04,0x00,0x00,0x01,0x01,0xAC,0x12,0xFF,0x00,
0x08,0x00,0x01,0x01,0xAC,0x12,0x31,0x00,0x08,0x00,0x01,0x01,0xAD,0x00,0x00,0x80,0x00,0x00,0x01,
0x01,0xAD,0x01,0x00,0x80,0x00,0x00,0x01,0x01,0xAD,0x02,0x00,0x80,0x00,0x00,0x01,0x01,0xAD,0x03,
0x00,0x80,0x00,0x00,0x01,0x01,0xAD,0x04,0x00,0x80,0x00,0x00,0x01,0x01,0xAD,0x05,0x00,0x80,0x00,
0x00,0x01,0x01,0xAD,0x06,0x00,0x80,0x00,0x00,0x01,0x01,0xAD,0x07,0x00,0x80,0x00,0x00,0x01,0x01,
0xAD,0x00,0x01,0x80,0x00,0x00,0x01,0x01,0xAD,0x01,0x01,0x80,0x00,0x00,0x01,0x01,0xAD,0x02,0x01,
0x80,0x00,0x00,0x01,0x01,0xAD,0x03,0x01,0x80,0x00,0x00,0x01,0x01,0xAD,0x04,0x01,0x80,0x00,0x00,
0x01,0x01,0xAD,0x05,0x01,0x80,0x00,0x00,0x01,0x01,0xAD,0x06,0x01,0x80,0x00,0x00,0x01,0x01,0xAD,
0x07,0x01,0x80,0x00,0x00,0x01,0x01,0xAD,0x00,0x03,0x80,0x00,0x00,0x01,0x01,0xAD,0x01,0x03,0x80,
0x00,0x00,0x01,0x01,0xAD,0x02,0x03,0x80,0x00,0x00,0x01,0x01,0xAD,0x03,0x03,0x80,0x00,0x00,0x01,
0x01,0xAD,0x04,0x03,0x80,0x00,0x00,0x01,0x01,0xAD,0x05,0x03,0x80,0x00,0x00,0x01,0x01,0xAD,0x06,
0x03,0x80,0x00,0x00,0x01,0x01,0xAD,0x07,0x03,0x80,0x00,0x00,0x01,0x01,0xAD,0x00,0x04,0x80,0x00,
0x00,0x01,0x01,0xAD,0x01,0x04,0x80,0x00,0x00,0x01,0x01,0xAD,0x02,0x04,0x80,0x00,0x00,0x01,0x01,
0xAD,0x03,0x04,0x80,0x00,0x00,0x01,0x01,0xAD,0x04,0x04,0x80,0x00,0x00,0x01,0x01,0xAD,0x05,0x04,
0x80,0x00,0x00,0x01,0x01,0xAD,0x06,0x04,0x80,0x00,0x00,0x01,0x01,0xAD,0x07,0x04,0x80,0x00,0x00,
0x01,0x01,0xAD,0x00,0x05,0x80,0x00,0x00,0x01,0x01,0xAD,0x01,0x05,0x80,0x00,0x00,0x01,0x01,0xAD,
0x02,0x05,0x80,0x00,0x00,0x01,0x01,0xAD,0x03,0x05,0x80,0x00,0x00,0x01,0x01,0xAD,0x04,0x05,0x80,
0x00,0x00,0x01,0x01,0xAD,0x05,0x05,0x80,0x00,0x00,0x01,0x01,0xAD,0x06,0x05,0x80,0x00,0x00,0x01,
0x01,0xAD,0x07,0x05,0x80,0x00,0x00,0x01,0x01,0xAD,0x00,0x06,0x80,0x00,0x00,0x01,0x01,0xAD,0x01,
0x06,0x80,0x00,0x00,0x01,0x01,0xAD,0x02,0x06,0x80,0x00,0x00,0x01,0x01,0xAD,0x03,0x06,0x80,0x00,
0x00,0x01,0x01,0xAD,0x04,0x06,0x80,0x00,0x00,0x01,0x01,0xAD,0x05,0x06,0x80,0x00,0x00,0x01,0x01,
0xAD,0x06,0x06,0x80,0x00,0x00,0x01,0x01,0xAD,0x07,0x06,0x80,0x00,0x00,0x01,0x01,0xAD,0x00,0x07,
0x80,0x00
};
byte SZL_ID_0011_IDX_XXXX[124] = {
0xFF,0x09,0x00,0x78,0x00,0x11,0x00,0x00,0x00,0x1C,0x00,0x04,0x00,0x01,0x36,0x45,0x53,0x37,0x20,
0x33,0x31,0x35,0x2D,0x32,0x45,0x48,0x31,0x34,0x2D,0x30,0x41,0x42,0x30,0x20,0x00,0xC0,0x00,0x04,
0x00,0x01,0x00,0x06,0x36,0x45,0x53,0x37,0x20,0x33,0x31,0x35,0x2D,0x32,0x45,0x48,0x31,0x34,0x2D,
0x30,0x41,0x42,0x30,0x20,0x00,0xC0,0x00,0x04,0x00,0x01,0x00,0x07,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0xC0,0x56,0x03,0x02,
0x06,0x00,0x81,0x42,0x6F,0x6F,0x74,0x20,0x4C,0x6F,0x61,0x64,0x65,0x72,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x00,0x00,0x41,0x20,0x09,0x09
};
byte SZL_ID_0012_IDX_XXXX[58] = {
0xFF,0x09,0x00,0x36,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x01,0x01,0x01,0x01,0x04,0x03,
0x02,0x03,0x03,0x03,0x04,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0A,0x03,0x0B,0x03,0x0C,
0x03,0x0D,0x03,0x0E,0x03,0x0F,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,
0x17
};
byte SZL_ID_0013_IDX_XXXX[192] = {
0xFF,0x09,0x00,0xBC,0x00,0x13,0x00,0x00,0x00,0x24,0x00,0x05,0x00,0x01,0x00,0x01,0x00,0x06,0x00,
0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x08,0x00,0x00,0x00,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x80,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x0C,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0014_IDX_XXXX[84] = {
0xFF,0x09,0x00,0x50,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x09,0x00,0x01,0x00,0x01,0x08,0x00,0x00,
0x00,0x00,0x02,0x00,0x01,0x08,0x00,0x00,0x00,0x00,0x03,0x00,0x01,0x40,0x00,0x00,0x80,0x00,0x04,
0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x05,0x00,0x01,0x01,0x00,0x00,0x08,0x00,0x06,0x00,0x01,0x08,
0x00,0x00,0x00,0x00,0x07,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0x08,0x00,0x00,0x10,
0x00,0x09,0x00,0x01,0x00,0x20,0x00,0x00
};
byte SZL_ID_0015_IDX_XXXX[62] = {
0xFF,0x09,0x00,0x3A,0x00,0x15,0x00,0x00,0x00,0x0A,0x00,0x05,0x08,0x00,0x00,0x16,0x03,0xD1,0x00,
0x00,0xFF,0xFE,0x0A,0x00,0x3E,0x81,0x03,0xD1,0x00,0x00,0xFF,0xFE,0x0B,0x00,0x04,0x22,0x03,0xD1,
0x00,0x00,0xFF,0xFE,0x0C,0x00,0x1F,0x40,0x03,0xD1,0x00,0x00,0xFF,0xFE,0x0E,0x00,0x1F,0x40,0x03,
0xD1,0x00,0x00,0xFF,0xFE
};
byte SZL_ID_0F14_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x14,0x00,0x00,0x00,0x08,0x00,0x09
};
byte SZL_ID_0019_IDX_XXXX[40] = {
0xFF,0x09,0x00,0x24,0x00,0x19,0x00,0x00,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x04,0x01,
0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x15,
0x00,0x00
};
byte SZL_ID_0F19_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x19,0x00,0x00,0x00,0x04,0x00,0x07
};
byte SZL_ID_001C_IDX_XXXX[352] = {
0xFF,0x09,0x01,0x5C,0x00,0x1C,0x00,0x00,0x00,0x22,0x00,0x0A,0x00,0x01,0x53,0x4E,0x41,0x50,0x37,
0x2D,0x53,0x45,0x52,0x56,0x45,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x43,0x50,0x55,0x20,0x33,0x31,0x35,0x2D,0x32,
0x20,0x50,0x4E,0x2F,0x44,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x4F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x20,0x53,0x69,0x65,0x6D,0x65,0x6E,0x73,0x20,
0x45,0x71,0x75,0x69,0x70,0x6D,0x65,0x6E,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x53,0x20,
0x43,0x2D,0x43,0x32,0x55,0x52,0x32,0x38,0x39,0x32,0x32,0x30,0x31,0x32,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x43,0x50,0x55,0x20,0x33,0x31,
0x35,0x2D,0x32,0x20,0x50,0x4E,0x2F,0x44,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x4D,0x4D,0x43,0x20,0x32,0x36,0x37,0x46,0x46,0x31,
0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x09,0x00,0x2A,0xF6,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0F1C_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x1C,0x00,0x00,0x00,0x22,0x00,0x0A
};
byte SZL_ID_0036_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x00,0x36,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0F36_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x36,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0025_IDX_XXXX[16] = {
0xFF,0x09,0x00,0x0C,0x00,0x25,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0x0C,0x3D,0x00
};
byte SZL_ID_0F25_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x25,0x00,0x00,0x00,0x04,0x00,0x01
};
byte SZL_ID_0037_IDX_XXXX[60] = {
0xFF,0x09,0x00,0x38,0x00,0x37,0x00,0x00,0x00,0x30,0x00,0x01,0x07,0xFE,0xC0,0xA8,0x01,0x0A,0xFF,
0xFF,0xFF,0x00,0xC0,0xA8,0x01,0x0A,0x00,0x1B,0x1B,0x1D,0x1A,0x2D,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x8F,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00
};
byte SZL_ID_0F37_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x37,0x00,0x00,0x00,0x30,0x00,0x01
};
byte SZL_ID_0074_IDX_XXXX[40] = {
0xFF,0x09,0x00,0x24,0x00,0x74,0x00,0x00,0x00,0x04,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x04,0x01,
0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x15,
0x00,0x00
};
byte SZL_ID_0F74_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x74,0x00,0x00,0x00,0x04,0x00,0x07
};
byte SZL_ID_0591_IDX_XXXX[76] = {
0xFF,0x09,0x00,0x48,0x05,0x91,0x00,0x00,0x00,0x10,0x00,0x04,0x00,0x00,0x02,0x01,0x07,0xFF,0xC4,
0xC0,0xC4,0xC0,0x00,0x00,0xB4,0x02,0x00,0x11,0x00,0x00,0x02,0x02,0x07,0xFE,0xA7,0xC4,0xA7,0xC4,
0x00,0x00,0xB4,0x02,0x00,0x11,0x00,0x00,0x02,0x03,0x07,0xFD,0x97,0xC5,0x97,0xC5,0x00,0x00,0xB4,
0x02,0x00,0x11,0x00,0x00,0x02,0x04,0x07,0xFC,0x97,0xC5,0x97,0xC5,0x00,0x00,0xB4,0x02,0x00,0x11
};
byte SZL_ID_0A91_IDX_XXXX[44] = {
0xFF,0x09,0x00,0x28,0x0A,0x91,0x00,0x00,0x00,0x10,0x00,0x02,0x01,0x00,0x02,0x01,0x07,0xFF,0xC4,
0xC0,0xC4,0xC0,0x00,0x01,0xFE,0x02,0x00,0x11,0x80,0x00,0x00,0x00,0x07,0xFB,0xA7,0xC4,0xA7,0xC4,
0x00,0x01,0xFE,0x02,0x00,0x11
};
byte SZL_ID_0F92_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x92,0x00,0x00,0x00,0x10,0x00,0x01
};
byte SZL_ID_0294_IDX_XXXX[270] = {
0xFF,0x09,0x01,0x0A,0x02,0x94,0x00,0x00,0x01,0x02,0x00,0x01,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};
byte SZL_ID_0794_IDX_XXXX[270] = {
0xFF,0x09,0x01,0x0A,0x07,0x94,0x00,0x00,0x01,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};
byte SZL_ID_0F94_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x94,0x00,0x00,0x01,0x02,0x00,0x01
};
byte SZL_ID_0095_IDX_XXXX[52] = {
0xFF,0x09,0x00,0x30,0x00,0x95,0x00,0x00,0x00,0x28,0x00,0x01,0x64,0x00,0x02,0x02,0x07,0xFE,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0F95_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x95,0x00,0x00,0x00,0x28,0x00,0x01
};
byte SZL_ID_00A0_IDX_XXXX[212] = {
0xFF,0x09,0x00,0xD0,0x00,0xA0,0x00,0x00,0x00,0x14,0x00,0x0A,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86
};
byte SZL_ID_0FA0_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0xA0,0x00,0x00,0x00,0x14,0x01,0xF4
};
byte SZL_ID_0017_IDX_XXXX[458] = { // <--Wrapped to 458 bytes
0xFF,0x09,0x01,0xC6,0x00,0x17,0x00,0x00,0x00,0x04,0x00,0x73,0x00,0x00,0x00,0x01,0x00,0x01,0x00,
0x03,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x07,0x00,0x01,0x00,0x16,
0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x65,0x00,0x01,0x00,0x66,0x00,0x01,0x00,0x67,0x00,0x01,0x00,
0x7A,0x00,0x01,0x00,0xC8,0x00,0x01,0x00,0xD2,0x00,0x01,0x02,0xBC,0x00,0x01,0x02,0xBD,0x00,0x01,
0x02,0xBE,0x00,0x01,0x02,0xBF,0x00,0x01,0x02,0xC0,0x00,0x01,0x02,0xC1,0x00,0x01,0x02,0xC2,0x00,
0x01,0x02,0xC3,0x00,0x01,0x02,0xC4,0x00,0x01,0x02,0xC5,0x00,0x01,0x02,0xC6,0x00,0x01,0x02,0xC7,
0x00,0x01,0x02,0xC8,0x00,0x01,0x02,0xC9,0x00,0x01,0x02,0xCA,0x00,0x01,0x02,0xCB,0x00,0x01,0x02,
0xCC,0x00,0x01,0x02,0xCD,0x00,0x01,0x02,0xCE,0x00,0x01,0x02,0xCF,0x00,0x01,0x02,0xD0,0x00,0x01,
0x02,0xD1,0x00,0x01,0x02,0xD2,0x00,0x01,0x02,0xD3,0x00,0x01,0x02,0xD4,0x00,0x01,0x02,0xD5,0x00,
0x01,0x02,0xD6,0x00,0x01,0x02,0xD7,0x00,0x01,0x02,0xD8,0x00,0x01,0x02,0xD9,0x00,0x01,0x02,0xDA,
0x00,0x01,0x02,0xDB,0x00,0x01,0x02,0xDC,0x00,0x01,0x02,0xDD,0x00,0x01,0x02,0xDE,0x00,0x01,0x02,
0xDF,0x00,0x01,0x02,0xE0,0x00,0x01,0x02,0xE1,0x00,0x01,0x02,0xE2,0x00,0x01,0x02,0xE3,0x00,0x01,
0x02,0xE4,0x00,0x01,0x02,0xE5,0x00,0x01,0x02,0xE6,0x00,0x01,0x02,0xE7,0x00,0x01,0x02,0xE8,0x00,
0x01,0x02,0xE9,0x00,0x01,0x02,0xEA,0x00,0x01,0x02,0xEB,0x00,0x01,0x02,0xEC,0x00,0x01,0x02,0xED,
0x00,0x01,0x02,0xEE,0x00,0x01,0x02,0xEF,0x00,0x01,0x02,0xF0,0x00,0x01,0x02,0xF1,0x00,0x01,0x02,
0xF2,0x00,0x01,0x02,0xF3,0x00,0x01,0x02,0xF4,0x00,0x01,0x02,0xF5,0x00,0x01,0x02,0xF6,0x00,0x01,
0x02,0xF7,0x00,0x01,0x02,0xF8,0x00,0x01,0x02,0xF9,0x00,0x01,0x02,0xFA,0x00,0x01,0x02,0xFB,0x00,
0x01,0x02,0xFC,0x00,0x01,0x02,0xFD,0x00,0x01,0x02,0xFE,0x00,0x01,0x02,0xFF,0x00,0x01,0x03,0x00,
0x00,0x01,0x03,0x01,0x00,0x01,0x03,0x02,0x00,0x01,0x03,0x03,0x00,0x01,0x03,0x04,0x00,0x01,0x03,
0x05,0x00,0x01,0x03,0x06,0x00,0x01,0x03,0x07,0x00,0x01,0x03,0x08,0x00,0x01,0x03,0x09,0x00,0x01,
0x03,0x0A,0x00,0x01,0x03,0x0B,0x00,0x01,0x03,0x0C,0x00,0x01,0x03,0x0D,0x00,0x01,0x03,0x0E,0x00,
0x01,0x03,0x0F,0x00,0x01,0x03,0x10,0x00,0x01,0x03,0x11,0x00,0x01,0x03,0x12,0x00,0x01,0x03,0x13,
0x00,0x01,0x03,0x14,0x00,0x01,0x03,0x15,0x00,0x01,0x03,0x16,0x00,0x01,0x03,0x17,0x00,0x01,0x03,
0x18,0x00,0x01,0x03,0x19,0x00,0x01,0x03,0x1A,0x00,0x01,0x03,0x1B,0x00,0x01,0x03,0x1C,0x00,0x01,
0x03,0x1D
};
byte SZL_ID_0F17_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x17,0x00,0x00,0x00,0x04,0x00,0x73
};
byte SZL_ID_0018_IDX_XXXX[28] = {
0xFF,0x09,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x01,0x00,
0x08,0x00,0x02,0x00,0x08,0x00,0x03,0x00,0x08
};
byte SZL_ID_0F18_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x18,0x00,0x00,0x00,0x04,0x00,0x04
};
byte SZL_ID_001A_IDX_XXXX[48] = {
0xFF,0x09,0x00,0x2C,0x00,0x1A,0x00,0x00,0x00,0x0C,0x00,0x03,0x09,0x01,0x01,0x05,0x00,0x08,0x00,
0x00,0x00,0x80,0x00,0x00,0x12,0x01,0x00,0x02,0x00,0x06,0x00,0x00,0x00,0x06,0x00,0x00,0x18,0x01,
0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00
};
byte SZL_ID_0F1A_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x1A,0x00,0x00,0x00,0x0C,0x00,0x03
};
byte SZL_ID_001B_IDX_XXXX[132] = {
0xFF,0x09,0x00,0x80,0x00,0x1B,0x00,0x00,0x00,0x14,0x00,0x06,0x09,0x00,0x00,0x00,0x00,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x06,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x70,0x00,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF3,0xFA,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x70,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xFF,0xDA,0x00,0x00,0x00,0x00,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,
0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0F1B_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x1B,0x00,0x00,0x00,0x14,0x00,0x06
};
byte SZL_ID_0021_IDX_XXXX[100] = {
0xFF,0x09,0x00,0x60,0x00,0x21,0x00,0x00,0x00,0x04,0x00,0x16,0x01,0x01,0x01,0x01,0x01,0x11,0xFE,
0x0A,0x01,0x21,0xFE,0x14,0x01,0x22,0xFE,0x15,0x01,0x33,0xFE,0x20,0x01,0x34,0xFE,0x21,0x01,0x35,
0xFE,0x22,0x01,0x36,0xFE,0x23,0x01,0x41,0xFE,0x28,0x01,0x55,0xFE,0x37,0x01,0x56,0xFE,0x38,0x01,
0x57,0xFE,0x39,0x01,0x64,0xFE,0x3D,0x00,0x01,0xFE,0x50,0x00,0x42,0xFE,0x52,0x00,0x61,0xFE,0x53,
0x00,0xA1,0xFE,0x55,0x00,0xC1,0xFE,0x56,0x00,0xD2,0xFE,0x57,0x00,0x81,0xFE,0x64,0x00,0x21,0xFE,
0x79,0x00,0x42,0xFE,0x7A
};
byte SZL_ID_0A21_IDX_XXXX[16] = {
0xFF,0x09,0x00,0x0C,0x0A,0x21,0x00,0x00,0x00,0x04,0x00,0x01,0x01,0x01,0x01,0x01
};
byte SZL_ID_0F21_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x21,0x00,0x00,0x00,0x04,0x00,0x16
};
byte SZL_ID_0023_IDX_XXXX[228] = {
0xFF,0x09,0x00,0xE0,0x00,0x23,0x00,0x00,0x00,0x12,0x00,0x0C,0x1A,0x00,0x00,0x00,0x10,0xBE,0x00,
0x00,0x08,0x00,0x0B,0xC0,0xFC,0x01,0xFF,0xFF,0xFF,0xF3,0x19,0x00,0x00,0x00,0x10,0x01,0x00,0x00,
0x08,0x00,0x0B,0xC0,0xFC,0x01,0xFF,0xFF,0xFF,0xF3,0x10,0x00,0x00,0x00,0x10,0x26,0x00,0x00,0x08,
0x00,0x0B,0xC0,0xFC,0x01,0xFF,0xFF,0xFF,0xF3,0x0C,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,
0x0B,0xC0,0xFC,0x01,0xFF,0xFF,0xFF,0xF3,0x0B,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,
0xC0,0xFC,0x01,0xFF,0xFF,0xFF,0xF3,0x0A,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,0xC0,
0xFC,0x01,0xFF,0xFF,0xFF,0xF3,0x09,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,0xC0,0xFC,
0x01,0xFF,0xFF,0xFF,0xF3,0x04,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,0xC0,0xFC,0x01,
0xFF,0xFF,0xFF,0xF3,0x03,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,0xC0,0xFC,0x01,0xFF,
0xFF,0xFF,0xF3,0x02,0x00,0x00,0x00,0x10,0x16,0x00,0x00,0x08,0x00,0x0B,0xC0,0xFC,0x01,0xFF,0xFF,
0xFF,0xF3,0x01,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,0xC0,0xFC,0x01,0xFF,0xFF,0xFF,
0xF3,0x1B,0x00,0x00,0x00,0x10,0x01,0x00,0x00,0x08,0x00,0x0B,0xC0,0xFC,0x01,0xFF,0xFF,0xFF,0xF3
};
byte SZL_ID_0F23_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x23,0x00,0x00,0x00,0x12,0x00,0x0C
};
byte SZL_ID_0024_IDX_XXXX[92] = {
0xFF,0x09,0x00,0x58,0x00,0x24,0x00,0x00,0x00,0x14,0x00,0x04,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,0x68,
0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56
};
byte SZL_ID_0124_IDX_XXXX[32] = {
0xFF,0x09,0x00,0x1C,0x01,0x24,0x00,0x00,0x00,0x14,0x00,0x01,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86
};
byte SZL_ID_0424_IDX_XXXX[32] = {
0xFF,0x09,0x00,0x1C,0x04,0x24,0x00,0x00,0x00,0x14,0x00,0x01,0x51,0x44,0xFF,
0x08, // <-- CPU Status
0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x05,0x02,0x01,0x55,0x90,0x67
};
byte SZL_ID_0038_IDX_XXXX[78] = {
0xFF,0x09,0x00,0x4A,0x00,0x38,0x00,0x00,0x00,0x42,0x00,0x01,0x00,0x01,0x07,0xFE,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0xE3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xEE,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0F38_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x38,0x00,0x00,0x00,0x42,0x00,0x01
};
byte SZL_ID_003A_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x00,0x3A,0x00,0x00,0x00,0x94,0x00,0x00
};
byte SZL_ID_0F3A_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x3A,0x00,0x00,0x00,0x94,0x00,0x08
};
byte SZL_ID_0F9A_IDX_XXXX[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x9A,0x00,0x00,0x01,0x1C,0x00,0x01
};
byte SZL_ID_0D91_IDX_0000[28] = {
0xFF,0x09,0x00,0x18,0x0D,0x91,0x00,0x00,0x00,0x10,0x00,0x01,0x00,0x00,0x02,0x00,0x7F,0xFF,0x00,
0xC0,0x00,0xC0,0x00,0x00,0xB4,0x02,0x00,0x11
};
byte SZL_ID_0092_IDX_0000[28] = {
0xFF,0x09,0x00,0x18,0x00,0x92,0x00,0x00,0x00,0x10,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0292_IDX_0000[28] = {
0xFF,0x09,0x00,0x18,0x02,0x92,0x00,0x00,0x00,0x10,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0692_IDX_0000[28] = {
0xFF,0x09,0x00,0x18,0x06,0x92,0x00,0x00,0x00,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0094_IDX_0000[270] = {
0xFF,0x09,0x01,0x0A,0x00,0x94,0x00,0x00,0x01,0x02,0x00,0x01,0x00,0x00,0x03,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};
byte SZL_ID_0D97_IDX_0000[60] = {
0xFF,0x09,0x00,0x38,0x0D,0x97,0x00,0x00,0x00,0x30,0x00,0x01,0x7F,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00
};
byte SZL_ID_0111_IDX_0001[40] = {
0xFF,0x09,0x00,0x24,0x01,0x11,0x00,0x01,0x00,0x1C,0x00,0x01,0x00,0x01,0x36,0x45,0x53,0x37,0x20,
0x33,0x31,0x35,0x2D,0x32,0x45,0x48,0x31,0x34,0x2D,0x30,0x41,0x42,0x30,0x20,0x00,0xC0,0x00,0x04,
0x00,0x01
};
byte SZL_ID_0111_IDX_0006[40] = {
0xFF,0x09,0x00,0x24,0x01,0x11,0x00,0x06,0x00,0x1C,0x00,0x01,0x00,0x06,0x36,0x45,0x53,0x37,0x20,
0x33,0x31,0x35,0x2D,0x32,0x45,0x48,0x31,0x34,0x2D,0x30,0x41,0x42,0x30,0x20,0x00,0xC0,0x00,0x04,
0x00,0x01
};
byte SZL_ID_0111_IDX_0007[40] = {
0xFF,0x09,0x00,0x24,0x01,0x11,0x00,0x07,0x00,0x1C,0x00,0x01,0x00,0x07,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0xC0,0x56,0x03,
0x02,0x06
};
byte SZL_ID_0F11_IDX_0001[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x11,0x00,0x00,0x00,0x1C,0x00,0x04
};
byte SZL_ID_0F11_IDX_0006[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x11,0x00,0x00,0x00,0x1C,0x00,0x04
};
byte SZL_ID_0F11_IDX_0007[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x11,0x00,0x00,0x00,0x1C,0x00,0x04
};
byte SZL_ID_0112_IDX_0000[14] = {
0xFF,0x09,0x00,0x0A,0x01,0x12,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x01
};
byte SZL_ID_0112_IDX_0100[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x12,0x01,0x00,0x00,0x02,0x00,0x02,0x01,0x01,0x01,0x04
};
byte SZL_ID_0112_IDX_0200[12] = {
0xFF,0x09,0x00,0x08,0x01,0x12,0x02,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0112_IDX_0400[12] = {
0xFF,0x09,0x00,0x08,0x01,0x12,0x04,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0F12_IDX_0000[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x12,0x00,0x00,0x00,0x02,0x00,0x17
};
byte SZL_ID_0F12_IDX_0100[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x12,0x00,0x00,0x00,0x02,0x00,0x17
};
byte SZL_ID_0F12_IDX_0200[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x12,0x00,0x00,0x00,0x02,0x00,0x17
};
byte SZL_ID_0F12_IDX_0400[12] = {
0xFF,0x09,0x00,0x08,0x0F,0x12,0x00,0x00,0x00,0x02,0x00,0x17
};
byte SZL_ID_0113_IDX_0001[48] = {
0xFF,0x09,0x00,0x2C,0x01,0x13,0x00,0x01,0x00,0x24,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x06,0x00,
0x00,0x00,0x11,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0115_IDX_0800[22] = {
0xFF,0x09,0x00,0x12,0x01,0x15,0x08,0x00,0x00,0x0A,0x00,0x01,0x08,0x00,0x00,0x16,0x03,0xD1,0x00,
0x00,0xFF,0xFE
};
byte SZL_ID_011C_IDX_0001[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x01,0x00,0x22,0x00,0x01,0x00,0x01,0x53,0x4D,0x41,0x52,0x54,
0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0002[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x02,0x00,0x22,0x00,0x01,0x00,0x02,0x43,0x50,0x55,0x20,0x33,
0x31,0x35,0x2D,0x32,0x20,0x50,0x4E,0x2F,0x44,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0003[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x03,0x00,0x22,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0004[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x04,0x00,0x22,0x00,0x01,0x00,0x04,0x4F,0x72,0x69,0x67,0x69,
0x6E,0x61,0x6C,0x20,0x53,0x69,0x65,0x6D,0x65,0x6E,0x73,0x20,0x45,0x71,0x75,0x69,0x70,0x6D,0x65,
0x6E,0x74,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0005[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x05,0x00,0x22,0x00,0x01,0x00,0x05,0x53,0x20,0x43,0x2D,0x43,
0x32,0x55,0x52,0x32,0x38,0x39,0x32,0x32,0x30,0x31,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0007[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x07,0x00,0x22,0x00,0x01,0x00,0x07,0x43,0x50,0x55,0x20,0x33,
0x31,0x35,0x2D,0x32,0x20,0x50,0x4E,0x2F,0x44,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0008[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x08,0x00,0x22,0x00,0x01,0x00,0x08,0x4D,0x4D,0x43,0x20,0x32,
0x36,0x37,0x46,0x46,0x31,0x31,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_0009[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x09,0x00,0x22,0x00,0x01,0x00,0x09,0x00,0x2A,0xF6,0x00,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_000A[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x0A,0x00,0x22,0x00,0x01,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_011C_IDX_000B[46] = {
0xFF,0x09,0x00,0x2A,0x01,0x1C,0x00,0x0B,0x00,0x22,0x00,0x01,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0222_IDX_0001[40] = {
0xFF,0x09,0x00,0x24,0x02,0x22,0x00,0x01,0x00,0x1C,0x00,0x01,0x11,0x03,0x01,0x01,0xC8,0x58,0x00,
0x00,0x00,0x00,0x00,0x01,0x94,0x02,0x05,0x02,0x01,0x56,0x64,0x77,0x00,0x10,0x00,0x08,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0222_IDX_000A[40] = {
0xFF,0x09,0x00,0x24,0x02,0x22,0x00,0x0A,0x00,0x1C,0x00,0x01,0x10,0x11,0x02,0x0A,0x00,0x50,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0222_IDX_0014[40] = {
0xFF,0x09,0x00,0x24,0x02,0x22,0x00,0x14,0x00,0x1C,0x00,0x01,0x10,0x21,0x03,0x14,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0222_IDX_0028[40] = {
0xFF,0x09,0x00,0x24,0x02,0x22,0x00,0x28,0x00,0x1C,0x00,0x01,0x10,0x41,0x10,0x28,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0222_IDX_0050[40] = {
0xFF,0x09,0x00,0x24,0x02,0x22,0x00,0x50,0x00,0x1C,0x00,0x01,0x35,0x01,0xFE,0x50,0xC8,0x58,0x00,
0x00,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0222_IDX_0064[40] = {
0xFF,0x09,0x00,0x24,0x02,0x22,0x00,0x64,0x00,0x1C,0x00,0x01,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,
0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x00,0x00,0x00,0x08,0x00,0x00,
0x00,0x00
};
byte SZL_ID_0125_IDX_0000[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x25,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x03,0x01,0x00
};
byte SZL_ID_0125_IDX_0001[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x25,0x00,0x01,0x00,0x04,0x00,0x01,0x01,0x0C,0x3D,0x00
};
byte SZL_ID_0225_IDX_0001[16] = {
0xFF,0x09,0x00,0x0C,0x02,0x25,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x03,0x01,0x00
};
byte SZL_ID_0132_IDX_0001[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03
};
byte SZL_ID_0132_IDX_0002[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x02,0x00,0x28,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x06,0x01,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0003[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x03,0x00,0x28,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0004[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x04,0x00,0x28,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x56,0x56,0x10,0x01,0x33,0x7B,0x02,0x00,0x75,0xF4,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0005[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x05,0x00,0x28,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0006[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x06,0x00,0x28,0x00,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0007[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x07,0x00,0x28,0x00,0x01,0x00,0x07,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0008[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x08,0x00,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x05,0x02,
0x01,0x56,0x94,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_0009[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x09,0x00,0x28,0x00,0x01,0x00,0x09,0x00,0x02,0xDC,0x6C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_000A[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x0A,0x00,0x28,0x00,0x01,0x00,0x0A,0x00,0x02,0xDC,0x6C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_000B[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x0B,0x00,0x28,0x00,0x01,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0132_IDX_000C[52] = {
0xFF,0x09,0x00,0x30,0x01,0x32,0x00,0x0C,0x00,0x28,0x00,0x01,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0232_IDX_0001[52] = {
0xFF,0x09,0x00,0x30,0x02,0x32,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03
};
byte SZL_ID_0232_IDX_0004[52] = {
0xFF,0x09,0x00,0x30,0x02,0x32,0x00,0x04,0x00,0x28,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x00,0x00,
0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x56,0x56,0x10,0x01,0x33,0x7B,0x02,0x00,0x75,0xF4,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0137_IDX_07FE[60] = {
0xFF,0x09,0x00,0x38,0x01,0x37,0x07,0xFE,0x00,0x30,0x00,0x01,0x07,0xFE,0xC0,0xA8,0x01,0x0A,0xFF,
0xFF,0xFF,0x00,0xC0,0xA8,0x01,0x0A,0x00,0x1B,0x1B,0x1D,0x1A,0x2D,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x8F,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00
};
byte SZL_ID_0174_IDX_0001[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x74,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x01,0x00,0x00
};
byte SZL_ID_0174_IDX_0004[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x74,0x00,0x04,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x00
};
byte SZL_ID_0174_IDX_0005[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x74,0x00,0x05,0x00,0x04,0x00,0x01,0x00,0x05,0x00,0x00
};
byte SZL_ID_0174_IDX_0006[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x74,0x00,0x06,0x00,0x04,0x00,0x01,0x00,0x06,0x00,0x00
};
byte SZL_ID_0174_IDX_000B[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x74,0x00,0x0B,0x00,0x04,0x00,0x01,0x00,0x0B,0x00,0x00
};
byte SZL_ID_0174_IDX_000C[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x74,0x00,0x0C,0x00,0x04,0x00,0x01,0x00,0x0C,0x00,0x00
};
byte SZL_ID_0194_IDX_0064[270] = {
0xFF,0x09,0x01,0x0A,0x01,0x94,0x00,0x64,0x01,0x02,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};
byte SZL_ID_0694_IDX_0064[270] = {
0xFF,0x09,0x01,0x0A,0x06,0x94,0x00,0x64,0x01,0x02,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00
};
byte SZL_ID_01A0_IDX_0000[12] = {
0xFF,0x09,0x00,0x08,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x00
};
byte SZL_ID_01A0_IDX_0001[32] = {
0xFF,0x09,0x00,0x1C,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x01,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86
};
byte SZL_ID_01A0_IDX_0002[52] = {
0xFF,0x09,0x00,0x30,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x02,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76
};
byte SZL_ID_01A0_IDX_0003[72] = {
0xFF,0x09,0x00,0x44,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x03,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66
};
byte SZL_ID_01A0_IDX_0004[92] = {
0xFF,0x09,0x00,0x58,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x04,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16
};
byte SZL_ID_01A0_IDX_0005[112] = {
0xFF,0x09,0x00,0x6C,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x05,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56
};
byte SZL_ID_01A0_IDX_0006[132] = {
0xFF,0x09,0x00,0x80,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x06,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46
};
byte SZL_ID_01A0_IDX_0007[152] = {
0xFF,0x09,0x00,0x94,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x07,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46
};
byte SZL_ID_01A0_IDX_0008[172] = {
0xFF,0x09,0x00,0xA8,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x08,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26
};
byte SZL_ID_01A0_IDX_0009[192] = {
0xFF,0x09,0x00,0xBC,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x09,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96
};
byte SZL_ID_01A0_IDX_000A[212] = {
0xFF,0x09,0x00,0xD0,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x0A,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86
};
byte SZL_ID_01A0_IDX_000B[232] = {
0xFF,0x09,0x00,0xE4,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x0B,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96
};
byte SZL_ID_01A0_IDX_000C[252] = {
0xFF,0x09,0x00,0xF8,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x0C,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66
};
byte SZL_ID_01A0_IDX_000D[272] = {
0xFF,0x09,0x01,0x0C,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x0D,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46
};
byte SZL_ID_01A0_IDX_000E[292] = {
0xFF,0x09,0x01,0x20,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x0E,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36
};
byte SZL_ID_01A0_IDX_000F[312] = {
0xFF,0x09,0x01,0x34,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x0F,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46
};
byte SZL_ID_01A0_IDX_0010[332] = {
0xFF,0x09,0x01,0x48,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x10,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x94,0x02,0x04,0x23,0x50,0x29,0x92,0x26
};
byte SZL_ID_01A0_IDX_0011[352] = {
0xFF,0x09,0x01,0x5C,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x11,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x94,0x02,0x04,0x23,0x50,0x29,0x92,0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,
0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x66
};
byte SZL_ID_01A0_IDX_0012[372] = {
0xFF,0x09,0x01,0x70,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x12,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x94,0x02,0x04,0x23,0x50,0x29,0x92,0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,
0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x66,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,
0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x56
};
byte SZL_ID_01A0_IDX_0013[392] = {
0xFF,0x09,0x01,0x84,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x13,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x94,0x02,0x04,0x23,0x50,0x29,0x92,0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,
0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x66,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,
0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x56,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,
0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x17,0x66
};
byte SZL_ID_01A0_IDX_0014[412] = {
0xFF,0x09,0x01,0x98,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x14,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x94,0x02,0x04,0x23,0x50,0x29,0x92,0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,
0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x66,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,
0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x56,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,
0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x17,0x66,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x49,0x19,0x75,0x46
};
byte SZL_ID_01A0_IDX_0015[432] = {
0xFF,0x09,0x01,0xAC,0x01,0xA0,0x00,0x00,0x00,0x14,0x00,0x15,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,
0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x86,0x13,0x81,0xFE,0x64,0xC7,0x72,
0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x38,0x76,0x43,0x01,0xFF,0x46,0xC7,
0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x52,0x16,0x29,0x66,0x43,0x04,0xFF,0x84,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x52,0x13,0x90,0x16,0x43,0x02,0xFF,
0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x56,0x13,0x81,
0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x88,0x46,0x43,
0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x51,0x21,0x79,0x46,
0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x51,0x19,0x48,
0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,0x45,
0x09,0x96,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x50,
0x45,0x09,0x86,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,
0x50,0x45,0x00,0x96,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,
0x23,0x50,0x42,0x54,0x66,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,
0x04,0x23,0x50,0x32,0x40,0x46,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,0x94,
0x02,0x04,0x23,0x50,0x32,0x40,0x36,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,0x08,0x14,0x77,0x14,
0x94,0x02,0x04,0x23,0x50,0x32,0x31,0x46,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x94,0x02,0x04,0x23,0x50,0x29,0x92,0x26,0x43,0x02,0xFF,0x68,0xC7,0x00,0x00,0x00,0x08,0x14,
0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x66,0x13,0x81,0xFE,0x64,0xC7,0x72,0x43,0x04,0x08,
0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x26,0x56,0x43,0x01,0xFF,0x46,0xC7,0x72,0x43,0x04,
0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x49,0x22,0x17,0x66,0x43,0x04,0xFF,0x84,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x94,0x02,0x04,0x23,0x49,0x19,0x75,0x46,0x43,0x02,0xFF,0x68,0xC7,0x00,
0x00,0x00,0x08,0x14,0x77,0x14,0x94,0x02,0x04,0x23,0x48,0x32,0x21,0x16
};
byte SZL_ID_0117_IDX_0000[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x17,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x01
};
byte SZL_ID_0117_IDX_0001[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x17,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x01,0x00,0x03
};
byte SZL_ID_0117_IDX_0002[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x17,0x00,0x02,0x00,0x04,0x00,0x01,0x00,0x02,0x00,0x02
};
byte SZL_ID_0117_IDX_0003[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x17,0x00,0x03,0x00,0x04,0x00,0x01,0x00,0x03,0x00,0x01
};
byte SZL_ID_0117_IDX_0004[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x17,0x00,0x04,0x00,0x04,0x00,0x01,0x00,0x04,0x00,0x01
};
byte SZL_ID_0118_IDX_0000[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x18,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x08
};
byte SZL_ID_0118_IDX_0001[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x18,0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x01,0x00,0x08
};
byte SZL_ID_0118_IDX_0002[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x18,0x00,0x02,0x00,0x04,0x00,0x01,0x00,0x02,0x00,0x08
};
byte SZL_ID_0118_IDX_0003[16] = {
0xFF,0x09,0x00,0x0C,0x01,0x18,0x00,0x03,0x00,0x04,0x00,0x01,0x00,0x03,0x00,0x08
};
byte SZL_ID_0131_IDX_0001[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x01,
0x08,0x00, // PDU SIZE : We expose 2048 00F0
0x04,0x00, // Max Commections : We expose 1024 0010
0x00,0xB7,0x1B,0x00,0x00,0x02,0xDC,0x6C,0x05,0xF5,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0002[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x02,0x00,0x28,0x00,0x01,0x00,0x02,0xBE,0xFD,0x4F,0x00,0x00,
0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x3C,0x01,0x08,0x00,0x00,0x00,0x7D,0x00,0x00,0x05,0x03,0x0F,
0x00,0x00,0x08,0x00,0x00,0x0C,0x00,0x0A,0x00,0x00,0x00,0x01,0x00,0x00
};
byte SZL_ID_0131_IDX_0003[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x03,0x00,0x28,0x00,0x01,0x00,0x03,0x7F,0xFC,0x83,0x01,
0x00,0xF0, // Max size of consistently readable data (will be set = PDU size)
0x00,0x10,0x00,0x01,0x02,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0004[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x04,0x00,0x28,0x00,0x01,0x00,0x04,0xFE,0x01,0x62,0x41,0x63,
0x00,0x1E,0x00,0x10,0x10,0x10,0x04,0x02,0x00,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0005[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x05,0x00,0x28,0x00,0x01,0x00,0x05,0x3E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x10,0x01,0xF4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0006[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x06,0x00,0x28,0x00,0x01,0x00,0x06,0xF3,0x00,0x00,0xF8,0x01,
0xF0,0xFF,0x4E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,
0x01,0x00,0x00,0x0E,0x00,0x4C,0xFF,0xFF,0x05,0xC0,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0007[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x07,0x00,0x28,0x00,0x01,0x00,0x07,0x01,0x00,0x3F,0x00,0x20,
0x01,0x01,0x00,0x00,0x00,0x01,0x08,0x01,0x08,0x01,0x08,0x20,0x08,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0008[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x08,0x00,0x28,0x00,0x01,0x00,0x08,0x70,0x03,0x70,0x02,0x70,
0x02,0x40,0x32,0x40,0x32,0x40,0x32,0x40,0x64,0x40,0x32,0x40,0x32,0x40,0x64,0x40,0x64,0x40,0x64,
0x40,0x64,0x40,0x64,0x40,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0131_IDX_0009[52] = {
0xFF,0x09,0x00,0x30,0x01,0x31,0x00,0x09,0x00,0x28,0x00,0x01,0x00,0x09,0x04,0x06,0x01,0x00,0x01,
0xF7,0x01,0xF7,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
byte SZL_ID_0C91_IDX_07FE[28] = {
0xFF,0x09,0x00,0x18,0x0C,0x91,0x07,0xFE,0x00,0x10,0x00,0x01,0x00,0x00,0x02,0x02,0x07,0xFE,0xA7,
0xC4,0xA7,0xC4,0x00,0x00,0xB4,0x02,0x00,0x11
};
#endif
================================================
FILE: deps/snap7/src/core/s7_isotcp.cpp
================================================
/*=============================================================================|
| PROJECT SNAP7 1.3.0 |
|==============================================================================|
| Copyright (C) 2013, 2015 Davide Nardella |
| All rights reserved. |
|==============================================================================|
| SNAP7 is free software: you can redistribute it and/or modify |
| it under the terms of the Lesser GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| It means that you can distribute your commercial software linked with |
| SNAP7 without the requirement to distribute the source code of your |
| application and without the requirement that your application be itself |
| distributed under LGPL. |
| |
| SNAP7 is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| Lesser GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License and a |
| copy of Lesser GNU General Public License along with Snap7. |
| If not, see http://www.gnu.org/licenses/ |
|=============================================================================*/
#include "s7_isotcp.h"
//---------------------------------------------------------------------------
TIsoTcpSocket::TIsoTcpSocket()
{
RecvTimeout = 3000; // Some old equipments are a bit slow to answer....
RemotePort = isoTcpPort;
// These fields should be $0000 and in any case RFC says that they are not considered.
// But some equipment...need a non zero value for the source reference.
DstRef = 0x0000;
SrcRef = 0x0100;
// PDU size requested
IsoPDUSize =1024;
IsoMaxFragments=MaxIsoFragments;
LastIsoError=0;
}
//---------------------------------------------------------------------------
TIsoTcpSocket::~TIsoTcpSocket()
{
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::CheckPDU(void *pPDU, u_char PduTypeExpected)
{
PIsoHeaderInfo Info;
int Size;
ClrIsoError();
if (pPDU!=0)
{
Info = PIsoHeaderInfo(pPDU);
Size = PDUSize(pPDU);
// Performs check
if (( Size<7 ) || ( Size>IsoPayload_Size ) || // Checks RFC 1006 header length
( Info->HLength<sizeof( TCOTP_DT )-1 ) || // Checks ISO 8073 header length
( Info->PDUType!=PduTypeExpected)) // Checks PDU Type
return SetIsoError(errIsoInvalidPDU);
else
return noError;
}
else
return SetIsoError(errIsoNullPointer);
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::SetIsoError(int Error)
{
LastIsoError = Error | LastTcpError;
return LastIsoError;
}
//---------------------------------------------------------------------------
void TIsoTcpSocket::ClrIsoError()
{
LastIsoError=0;
LastTcpError=0;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::BuildControlPDU()
{
int ParLen, IsoLen;
ClrIsoError();
FControlPDU.COTP.Params.PduSizeCode=0xC0; // code that identifies TPDU size
FControlPDU.COTP.Params.PduSizeLen =0x01; // 1 byte this field
switch(IsoPDUSize)
{
case 128:
FControlPDU.COTP.Params.PduSizeVal =0x07;
break;
case 256:
FControlPDU.COTP.Params.PduSizeVal =0x08;
break;
case 512:
FControlPDU.COTP.Params.PduSizeVal =0x09;
break;
case 1024:
FControlPDU.COTP.Params.PduSizeVal =0x0A;
break;
case 2048:
FControlPDU.COTP.Params.PduSizeVal =0x0B;
break;
case 4096:
FControlPDU.COTP.Params.PduSizeVal =0x0C;
break;
case 8192:
FControlPDU.COTP.Params.PduSizeVal =0x0D;
break;
default:
FControlPDU.COTP.Params.PduSizeVal =0x0B; // Our Default
};
// Build TSAPs
FControlPDU.COTP.Params.TSAP[0]=0xC1; // code that identifies source TSAP
FControlPDU.COTP.Params.TSAP[1]=2; // source TSAP Len
FControlPDU.COTP.Params.TSAP[2]=(SrcTSap>>8) & 0xFF; // HI part
FControlPDU.COTP.Params.TSAP[3]=SrcTSap & 0xFF; // LO part
FControlPDU.COTP.Params.TSAP[4]=0xC2; // code that identifies dest TSAP
FControlPDU.COTP.Params.TSAP[5]=2; // dest TSAP Len
FControlPDU.COTP.Params.TSAP[6]=(DstTSap>>8) & 0xFF; // HI part
FControlPDU.COTP.Params.TSAP[7]=DstTSap & 0xFF; // LO part
// Params length
ParLen=11; // 2 Src TSAP (Code+field Len) +
// 2 Src TSAP len +
// 2 Dst TSAP (Code+field Len) +
// 2 Src TSAP len +
// 3 PDU size (Code+field Len+Val) = 11
// Telegram length
IsoLen=sizeof(TTPKT)+ // TPKT Header
7 + // COTP Header Size without params
ParLen; // COTP params
FControlPDU.TPKT.Version =isoTcpVersion;
FControlPDU.TPKT.Reserved =0;
FControlPDU.TPKT.HI_Lenght=0; // Connection Telegram size cannot exced 255 bytes, so
// this field is always 0
FControlPDU.TPKT.LO_Lenght=IsoLen;
FControlPDU.COTP.HLength =ParLen + 6; // <-- 6 = 7 - 1 (COTP Header size - 1)
FControlPDU.COTP.PDUType =pdu_type_CR; // Connection Request
FControlPDU.COTP.DstRef =DstRef; // Destination reference
FControlPDU.COTP.SrcRef =SrcRef; // Source reference
FControlPDU.COTP.CO_R =0x00; // Class + Option : RFC0983 states that it must be always 0x40
// but for some equipment (S7) must be 0 in disaccord of specifications !!!
return noError;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::PDUSize(void *pPDU)
{
return PIsoHeaderInfo(pPDU)->TPKT.HI_Lenght*256+PIsoHeaderInfo( pPDU )->TPKT.LO_Lenght;
}
//---------------------------------------------------------------------------
void TIsoTcpSocket::IsoParsePDU(TIsoControlPDU pdu)
{
// Currently we accept a connection with any kind of src/dst tsap
// Override to implement special filters.
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::IsoConfirmConnection(u_char PDUType)
{
PIsoControlPDU CPDU = PIsoControlPDU(&PDU);
u_short TempRef;
ClrIsoError();
PDU.COTP.PDUType=PDUType;
// Exchange SrcRef<->DstRef, not strictly needed by COTP 8073 but S7PLC as client needs it.
TempRef=CPDU->COTP.DstRef;
CPDU->COTP.DstRef=CPDU->COTP.SrcRef;
CPDU->COTP.SrcRef=0x0100;//TempRef;
return SendPacket(&PDU,PDUSize(&PDU));
}
//---------------------------------------------------------------------------
void TIsoTcpSocket::FragmentSkipped(int Size)
{
// override for log purpose
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoConnect()
{
pbyte TmpControlPDU;
PIsoControlPDU ControlPDU;
u_int Length;
int Result;
// Build the default connection telegram
BuildControlPDU();
ControlPDU =&FControlPDU;
// Checks the format
Result =CheckPDU(ControlPDU, pdu_type_CR);
if (Result!=0)
return Result;
Result =SckConnect();
if (Result==noError)
{
// Calcs the length
Length =PDUSize(ControlPDU);
// Send connection telegram
SendPacket(ControlPDU, Length);
if (LastTcpError==0)
{
TmpControlPDU = pbyte(ControlPDU);
// Receives TPKT header (4 bytes)
RecvPacket(TmpControlPDU, sizeof(TTPKT));
if (LastTcpError==0)
{
// Calc the packet length
Length =PDUSize(TmpControlPDU);
// Check if it fits in the buffer and if it's greater then TTPKT size
if ((Length<=sizeof(TIsoControlPDU)) && (Length>sizeof(TTPKT)))
{
// Points to COTP
TmpControlPDU+=sizeof(TTPKT);
Length -= sizeof(TTPKT);
// Receives remainin bytes 4 bytes after
RecvPacket(TmpControlPDU, Length);
if (LastTcpError==0)
{
// Finally checks the Connection Confirm telegram
Result =CheckPDU(ControlPDU, pdu_type_CC);
if (Result!=0)
LastIsoError=Result;
}
else
Result =SetIsoError(errIsoRecvPacket);
}
else
Result =SetIsoError(errIsoInvalidPDU);
}
else
Result =SetIsoError(errIsoRecvPacket);
// Flush buffer
if (Result!=0)
Purge();
}
else
Result =SetIsoError(errIsoSendPacket);
if (Result!=0)
SckDisconnect();
}
return Result;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoSendBuffer(void *Data, int Size)
{
int Result;
u_int IsoSize;
ClrIsoError();
// Total Size = Size + Header Size
IsoSize =Size+DataHeaderSize;
// Checks the length
if ((IsoSize>0) && (IsoSize<=IsoFrameSize))
{
// Builds the header
Result =0;
// TPKT
PDU.TPKT.Version = isoTcpVersion;
PDU.TPKT.Reserved = 0;
PDU.TPKT.HI_Lenght= (u_short(IsoSize)>> 8) & 0xFF;
PDU.TPKT.LO_Lenght= u_short(IsoSize) & 0xFF;
// COPT
PDU.COTP.HLength =sizeof(TCOTP_DT)-1;
PDU.COTP.PDUType =pdu_type_DT;
PDU.COTP.EoT_Num =pdu_EoT;
// Fill payload
if (Data!=0) // Data=null ==> use internal buffer PDU.Payload
memcpy(&PDU.Payload, Data, Size);
// Send over TCP/IP
SendPacket(&PDU, IsoSize);
if (LastTcpError!=0)
Result =SetIsoError(errIsoSendPacket);
}
else
Result =SetIsoError(errIsoInvalidDataSize );
return Result;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoRecvBuffer(void *Data, int & Size)
{
int Result;
ClrIsoError();
Size =0;
Result =isoRecvPDU(&PDU);
if (Result==0)
{
Size =PDUSize( &PDU )-DataHeaderSize;
if (Data!=0) // Data=NULL ==> a child will consume directly PDY.Payload
memcpy(Data, &PDU.Payload, Size);
}
return Result;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoExchangeBuffer(void *Data, int &Size)
{
int Result;
ClrIsoError();
Result =isoSendBuffer(Data, Size);
if (Result==0)
Result =isoRecvBuffer(Data, Size);
return Result;
}
//---------------------------------------------------------------------------
bool TIsoTcpSocket::IsoPDUReady()
{
ClrIsoError();
return PacketReady(sizeof(TCOTP_DT));
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoDisconnect(bool OnlyTCP)
{
int Result;
ClrIsoError();
if (Connected)
Purge(); // Flush pending
LastIsoError=0;
// OnlyTCP true -> Disconnect Request telegram is not required : only TCP disconnection
if (!OnlyTCP)
{
// if we are connected -> we have a valid connection telegram
if (Connected)
FControlPDU.COTP.PDUType =pdu_type_DR;
// Checks the format
Result =CheckPDU(&FControlPDU, pdu_type_DR);
if (Result!=0)
return Result;
// Sends Disconnect request
SendPacket(&FControlPDU, PDUSize(&FControlPDU));
if (LastTcpError!=0)
{
Result =SetIsoError(errIsoSendPacket);
return Result;
}
}
// TCP disconnect
SckDisconnect();
if (LastTcpError!=0)
Result =SetIsoError(errIsoDisconnect);
else
Result =0;
return Result;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoSendPDU(PIsoDataPDU Data)
{
int Result;
ClrIsoError();
Result=CheckPDU(Data,pdu_type_DT);
if (Result==0)
{
SendPacket(Data,PDUSize(Data));
if (LastTcpError!=0)
Result=SetIsoError(errIsoSendPacket);
}
return Result;
}
//------------------------------------------------------------------------------
int TIsoTcpSocket::isoRecvFragment(void *From, int Max, int &Size, bool &EoT)
{
int DataLength;
Size =0;
EoT =false;
byte PDUType;
ClrIsoError();
// header is received always from beginning
RecvPacket(&PDU, DataHeaderSize); // TPKT + COPT_DT
if (LastTcpError==0)
{
PDUType=PDU.COTP.PDUType;
switch (PDUType)
{
case pdu_type_CR:
case pdu_type_DR:
EoT=true;
break;
case pdu_type_DT:
EoT = (PDU.COTP.EoT_Num & 0x80) == 0x80; // EoT flag
break;
default:
return SetIsoError(errIsoInvalidPDU);
}
DataLength = PDUSize(&PDU) - DataHeaderSize;
if (CheckPDU(&PDU, PDUType)!=0)
return LastIsoError;
// Checks for data presence
if (DataLength>0) // payload present
{
// Check if the data fits in the buffer
if(DataLength<=Max)
{
RecvPacket(From, DataLength);
if (LastTcpError!=0)
return SetIsoError(errIsoRecvPacket);
else
Size =DataLength;
}
else
return SetIsoError(errIsoPduOverflow);
}
}
else
return SetIsoError(errIsoRecvPacket);
return LastIsoError;
}
//---------------------------------------------------------------------------
// Fragments Recv schema
//------------------------------------------------------------------------------
//
// packet 1 packet 2 packet 3
// +--------+------------+ +--------+------------+ +--------+------------+
// | HEADER | FRAGMENT 1 | | HEADER | FRAGMENT 2 | | HEADER | FRAGMENT 3 |
// +--------+------------+ +--------+------------+ +--------+------------+
// | | |
// | +-----------+ |
// | | |
// | | +------------------------+
// | | | (Packet 3 has EoT Flag set)
// V V V
// +--------+------------+------------+------------+
// | HEADER | FRAGMENT 1 : FRAGMENT 2 : FRAGMENT 3 |
// +--------+------------+------------+------------+
// ^
// |
// +-- A new header is built with updated info
//
//------------------------------------------------------------------------------
int TIsoTcpSocket::isoRecvPDU(PIsoDataPDU Data)
{
int Result;
int Size;
pbyte pData;
int max;
int Offset;
int Received;
int NumParts;
bool Complete;
NumParts =1;
Offset =0;
Complete =false;
ClrIsoError();
pData = pbyte(&PDU.Payload);
do {
pData=pData+Offset;
max =IsoPayload_Size-Offset; // Maximum packet allowed
if (max>0)
{
Result =isoRecvFragment(pData, max, Received, Complete);
if((Result==0) && !Complete)
{
++NumParts;
Offset += Received;
if (NumParts>IsoMaxFragments)
Result =SetIsoError(errIsoTooManyFragments);
}
}
else
Result =SetIsoError(errIsoTooManyFragments);
} while ((!Complete) && (Result==0));
if (Result==0)
{
// Add to offset the header size
Size =Offset+Received+DataHeaderSize;
// Adjust header
PDU.TPKT.HI_Lenght =(u_short(Size)>>8) & 0xFF;
PDU.TPKT.LO_Lenght =u_short(Size) & 0xFF;
// Copies data if target is not the local PDU
if (Data!=&PDU)
memcpy(Data, &PDU, Size);
}
else
if (LastTcpError!=WSAECONNRESET)
Purge();
return Result;
}
//---------------------------------------------------------------------------
int TIsoTcpSocket::isoExchangePDU(PIsoDataPDU Data)
{
int Result;
ClrIsoError();
Result=isoSendPDU(Data);
if (Result==0)
Result=isoRecvPDU(Data);
return Result;
}
//---------------------------------------------------------------------------
void TIsoTcpSocket::IsoPeek(void *pPDU, TPDUKind &PduKind)
{
PIsoHeaderInfo Info;
u_int IsoLen;
Info=PIsoHeaderInfo(pPDU);
IsoLen=PDUSize(Info);
// Check for empty fragment : size of PDU = size of header and nothing else
if (IsoLen==DataHeaderSize )
{
// We don't need to check the EoT flag since the PDU is empty....
PduKind=pkEmptyFragment;
return;
};
// Check for invalid packet : size of PDU < size of header
if (IsoLen<DataHeaderSize )
{
PduKind=pkInvalidPDU;
return;
};
// Here IsoLen>DataHeaderSize : check the PDUType
switch (Info->PDUType)
{
case pdu_type_CR:
PduKind=pkConnectionRequest;
break;
case pdu_type_DR:
PduKind=pkDisconnectRequest;
break;
case pdu_type_DT:
PduKind=pkValidData;
break;
default:
PduKind=pkUnrecognizedType;
};
}
================================================
FILE: deps/snap7/src/core/s7_isotcp.h
================================================
/*=============================================================================|
| PROJECT SNAP7 1.3.0 |
|==============================================================================|
| Copyright (C) 2013, 2015 Davide Nardella |
| All rights reserved. |
|==============================================================================|
| SNAP7 is free software: you can redistribute it and/or modify |
| it under the terms of the Lesser GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| It means that you can distribute your commercial software linked with |
| SNAP7 without the requirement to distribute the source code of your |
| application and without the requirement that your application be itself |
| distributed under LGPL. |
| |
| SNAP7 is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| Lesser GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License and a |
| copy of Lesser GNU General Public License along with Snap7. |
| If not, see http://www.gnu.org/licenses/ |
|=============================================================================*/
#ifndef s7_isotcp_h
#define s7_isotcp_h
//---------------------------------------------------------------------------
#include "snap_msgsock.h"
//---------------------------------------------------------------------------
#pragma pack(1)
#define isoTcpVersion 3 // RFC 1006
#define isoTcpPort 102 // RFC 1006
#define isoInvalidHandle 0
#define MaxTSAPLength 16 // Max Lenght for Src and Dst TSAP
#define MaxIsoFragments 64 // Max fragments
#define IsoPayload_Size 4096 // Iso telegram Buffer size
#define noError 0
const longword errIsoMask = 0x000F0000;
const longword errIsoBase = 0x0000FFFF;
const longword errIsoConnect = 0x00010000; // Connection error
const longword errIsoDisconnect = 0x00020000; // Disconnect error
const longword errIsoInvalidPDU = 0x00030000; // Bad format
const longword errIsoInvalidDataSize = 0x00040000; // Bad Datasize passed to send/recv : buffer is invalid
const longword errIsoNullPointer = 0x00050000; // Null passed as pointer
const longword errIsoShortPacket = 0x00060000; // A short packet received
const longword errIsoTooManyFragments = 0x00070000; // Too many packets without EoT flag
const longword errIsoPduOverflow = 0x00080000; // The sum of fragments data exceded maximum packet size
const longword errIsoSendPacket = 0x00090000; // An error occurred during send
const longword errIsoRecvPacket = 0x000A0000; // An error occurred during recv
const longword errIsoInvalidParams = 0x000B0000; // Invalid TSAP params
const longword errIsoResvd_1 = 0x000C0000; // Unassigned
const longword errIsoResvd_2 = 0x000D0000; // Unassigned
const longword errIsoResvd_3 = 0x000E0000; // Unassigned
const longword errIsoResvd_4 = 0x000F0000; // Unassigned
const longword ISO_OPT_TCP_NODELAY = 0x00000001; // Disable Nagle algorithm
const longword ISO_OPT_INSIDE_MTU = 0x00000002; // Max packet size < MTU ethernet card
// TPKT Header - ISO on TCP - RFC 1006 (4 bytes)
typedef struct{
u_char Version; // Always 3 for RFC 1006
u_char Reserved; // 0
u_char HI_Lenght; // High part of packet lenght (entire frame, payload and TPDU included)
u_char LO_Lenght; // Low part of packet lenght (entire frame, payload and TPDU included)
} TTPKT; // Packet length : min 7 max 65535
typedef struct {
u_char PduSizeCode;
u_char PduSizeLen;
u_char PduSizeVal;
u_char TSAP[245]; // We don't know in advance these fields....
} TCOPT_Params ;
// PDU Type constants - ISO 8073, not all are mentioned in RFC 1006
// For our purposes we use only those labeled with **
// These constants contains 4 low bit order 0 (credit nibble)
//
// $10 ED : Expedited Data
// $20 EA : Expedited Data Ack
// $40 UD : CLTP UD
// $50 RJ : Reject
// $70 AK : Ack data
// ** $80 DR : Disconnect request (note : S7 doesn't use it)
// ** $C0 DC : Disconnect confirm (note : S7 doesn't use it)
// ** $D0 CC : Connection confirm
// ** $E0 CR : Connection request
// ** $F0 DT : Data
//
// COTP Header for CONNECTION REQUEST/CONFIRM - DISCONNECT REQUEST/CONFIRM
typedef struct {
u_char HLength; // Header length : initialized to 6 (length without params - 1)
// descending classes that add values in params field must update it.
u_char PDUType; // 0xE0 Connection request
// 0xD0 Connection confirm
// 0x80 Disconnect request
// 0xDC Disconnect confirm
u_short DstRef; // Destination reference : Always 0x0000
u_short SrcRef; // Source reference : Always 0x0000
u_char CO_R; // If the telegram is used for Connection request/Confirm,
// the meaning of this field is CLASS+OPTION :
// Class (High 4 bits) + Option (Low 4 bits)
// Class : Always 4 (0100) but is ignored in input (RFC States this)
// Option : Always 0, also this in ignored.
// If the telegram is used for Disconnect request,
// the meaning of this field is REASON :
// 1 Congestion at TSAP
// 2 Session entity not attached to TSAP
// 3 Address unknown (at TCP connect time)
// 128+0 Normal disconnect initiated by the session
// entity.
// 128+1 Remote transport entity congestion at connect
// request time
// 128+3 Connection negotiation failed
// 128+5 Protocol Error
// 128+8 Connection request refused on this network
// connection
// Parameter data : depending on the protocol implementation.
// ISO 8073 define several type of parameters, but RFC 1006 recognizes only
// TSAP related parameters and PDU size. See RFC 0983 for more details.
TCOPT_Params Params;
/* Other params not used here, list only for completeness
ACK_TIME = 0x85, 1000 0101 Acknowledge Time
RES_ERROR = 0x86, 1000 0110 Residual Error Rate
PRIORITY = 0x87, 1000 0111 Priority
TRANSIT_DEL = 0x88, 1000 1000 Transit Delay
THROUGHPUT = 0x89, 1000 1001 Throughput
SEQ_NR = 0x8A, 1000 1010 Subsequence Number (in AK)
REASSIGNMENT = 0x8B, 1000 1011 Reassignment Time
FLOW_CNTL = 0x8C, 1000 1100 Flow Control Confirmation (in AK)
TPDU_SIZE = 0xC0, 1100 0000 TPDU Size
SRC_TSAP = 0xC1, 1100 0001 TSAP-ID / calling TSAP ( in CR/CC )
DST_TSAP = 0xC2, 1100 0010 TSAP-ID / called TSAP
CHECKSUM = 0xC3, 1100 0011 Checksum
VERSION_NR = 0xC4, 1100 0100 Version Number
PROTECTION = 0xC5, 1100 0101 Protection Parameters (user defined)
OPT_SEL = 0xC6, 1100 0110 Additional Option Selection
PROTO_CLASS = 0xC7, 1100 0111 Alternative Protocol Classes
PREF_MAX_TPDU_SIZE = 0xF0, 1111 0000
INACTIVITY_TIMER = 0xF2, 1111 0010
ADDICC = 0xe0 1110 0000 Additional Information on Connection Clearing
*/
} TCOTP_CO ;
typedef TCOTP_CO *PCOTP_CO;
// COTP Header for DATA EXCHANGE
typedef struct {
u_char HLength; // Header length : 3 for this header
u_char PDUType; // 0xF0 for this header
u_char EoT_Num; // EOT (bit 7) + PDU Number (bits 0..6)
// EOT = 1 -> End of Trasmission Packet (This packet is complete)
// PDU Number : Always 0
} TCOTP_DT;
typedef TCOTP_DT *PCOTP_DT;
// Info part of a PDU, only common parts. We use it to check the consistence
// of a telegram regardless of it's nature (control or data).
typedef struct {
TTPKT TPKT; // TPKT Header
// Common part of any COTP
u_char HLength; // Header length : 3 for this header
u_char PDUType; // Pdu type
} TIsoHeaderInfo ;
typedef TIsoHeaderInfo *PIsoHeaderInfo;
// PDU Type consts (Code + Credit)
const byte pdu_type_CR = 0xE0; // Connection request
const byte pdu_type_CC = 0xD0; // Connection confirm
const byte pdu_type_DR = 0x80; // Disconnect request
const byte pdu_type_DC = 0xC0; // Disconnect confirm
const byte pdu_type_DT = 0xF0; // Data transfer
const byte pdu_EoT = 0x80; // End of Trasmission Packet (This packet is complete)
const longword DataHeaderSize = sizeof(TTPKT)+sizeof(TCOTP_DT);
const longword IsoFrameSize = IsoPayload_Size+DataHeaderSize;
typedef struct {
TTPKT TPKT; // TPKT Header
TCOTP_CO COTP; // COPT Header for CONNECTION stuffs
} TIsoControlPDU;
typedef TIsoControlPDU *PIsoControlPDU;
typedef u_char TIsoPayload[IsoPayload_Size];
typedef struct {
TTPKT TPKT; // TPKT Header
TCOTP_DT COTP; // COPT Header for DATA EXCHANGE
TIsoPayload Payload; // Payload
} TIsoDataPDU ;
typedef TIsoDataPDU *PIsoDataPDU;
typedef TIsoPayload *PIsoPayload;
typedef enum {
pkConnectionRequest,
pkDisconnectRequest,
pkEmptyFragment,
pkInvalidPDU,
pkUnrecognizedType,
pkValidData
} TPDUKind ;
#pragma pack()
void ErrIsoText(int Error, char *Msg, int len);
class TIsoTcpSocket : public TMsgSocket
{
private:
TIsoControlPDU FControlPDU;
int IsoMaxFragments; // max fragments allowed for an ISO telegram
// Checks the PDU format
int CheckPDU(void *pPDU, u_char PduTypeExpected);
// Receives the next fragment
int isoRecvFragment(void *From, int Max, int &Size, bool &EoT);
protected:
TIsoDataPDU PDU;
int SetIsoError(int Error);
// Builds the control PDU starting from address properties
virtual int BuildControlPDU();
// Calcs the PDU size
int PDUSize(void *pPDU);
// Parses the connection request PDU to extract TSAP and PDU size info
virtual void IsoParsePDU(TIsoControlPDU PDU);
// Confirms the connection, override this method for special pourpose
// By default it checks the PDU format and resend it changing the pdu type
int IsoConfirmConnection(u_char PDUType);
void ClrIsoError();
virtual void FragmentSkipped(int Size);
public:
word SrcTSap; // Source TSAP
word DstTSap; // Destination TSAP
word SrcRef; // Source Reference
word DstRef; // Destination Reference
int IsoPDUSize;
int LastIsoError;
//--------------------------------------------------------------------------
TIsoTcpSocket();
~TIsoTcpSocket();
// HIGH Level functions (work on payload hiding the underlying protocol)
// Connects with a peer, the connection PDU is automatically built starting from address scheme (see below)
int isoConnect();
// Disconnects from a peer, if OnlyTCP = true, only a TCP disconnect is performed,
// otherwise a disconnect PDU is built and send.
int isoDisconnect(bool OnlyTCP);
// Sends a buffer, a valid header is created
int isoSendBuffer(void *Data, int Size);
// Receives a buffer
int isoRecvBuffer(void *Data, int & Size);
// Exchange cycle send->receive
int isoExchangeBuffer(void *Data, int & Size);
// A PDU is ready (at least its header) to be read
bool IsoPDUReady();
// Same as isoSendBuffer, but the entire PDU has to be provided (in any case a check is performed)
int isoSendPDU(PIsoDataPDU Data);
// Same as isoRecvBuffer, but it returns the entire PDU, automatically enques the fragments
int isoRecvPDU(PIsoDataPDU Data);
// Same as isoExchangeBuffer, but the entire PDU has to be provided (in any case a check is performed)
int isoExchangePDU(PIsoDataPDU Data);
// Peeks an header info to know which kind of telegram is incoming
void IsoPeek(void *pPDU, TPDUKind &PduKind);
};
#endif // s7_isotcp_h
================================================
FILE: deps/snap7/src/core/s7_micro_client.cpp
================================================
/*=============================================================================|
| PROJECT SNAP7 1.3.0 |
|==============================================================================|
| Copyright (C) 2013, 2015 Davide Nardella |
| All rights reserved. |
|==============================================================================|
| SNAP7 is free software: you can redistribute it and/or modify |
| it under the terms of the Lesser GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| It means that you can distribute your commercial software linked with |
| SNAP7 without the requirement to distribute the source code of your |
| application and without the requirement that your application be itself |
| distributed under LGPL. |
| |
| SNAP7 is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| Lesser GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License and a |
| copy of Lesser GNU General Public License along with Snap7. |
| If not, see http://www.gnu.org/licenses/ |
|=============================================================================*/
#include "s7_micro_client.h"
//---------------------------------------------------------------------------
TSnap7MicroClient::TSnap7MicroClient()
{
SrcRef =0x0100; // RFC0983 states that SrcRef and DetRef should be 0
// and, in any case, they are ignored.
// S7 instead requires a number != 0
// Libnodave uses 0x0100
// S7Manager uses 0x0D00
// TIA Portal V12 uses 0x1D00
// WinCC uses 0x0300
// Seems that every non zero value is good enough...
DstRef =0x0000;
SrcTSap =0x0100;
DstTSap =0x0000; // It's filled by connection functions
ConnectionType = CONNTYPE_PG; // Default connection type
memset(&Job,0,sizeof(TSnap7Job));
}
//---------------------------------------------------------------------------
TSnap7MicroClient::~TSnap7MicroClient()
{
Destroying = true;
}
//---------------------------------------------------------------------------
int TSnap7MicroClient::opReadArea()
{
PReqFunReadParams ReqParams;
PResFunReadParams ResParams;
PS7ResHeader23 Answer;
PResFunReadItem ResData;
word RPSize; // ReqParams size
int WordSize;
uintptr_t Offset;
pbyte Target;
int Address;
int IsoSize;
int Start;
int MaxElements; // Max elements that we can transfer in a PDU
word NumElements; // Num of elements that we are asking for this telegram
int TotElements; // Total elements requested
int Size;
int Result;
WordSize=DataSizeByte(Job.WordLen); // The size in bytes of an element that we are asking for
if (WordSize==0)
return errCliInvalidWordLen;
// First check : params bounds
if ((Job.Number<0) || (Job.Number>65535) || (Job.Start<0) || (Job.Amount<1))
return errCliInvalidParams;
// Second check : transport size
if ((Job.WordLen==S7WLBit) && (Job.Amount>1))
return errCliInvalidTransportSize;
// Request Params size
RPSize =sizeof(TReqFunReadItem)+2; // 1 item + FunRead + ItemsCount
// Setup pointers (note : PDUH_out and PDU.Payload are the same pointer)
ReqParams =PReqFunReadParams(pbyte(PDUH_out)+sizeof(TS7ReqHeader));
Answer =PS7ResHeader23(&PDU.Payload);
ResParams =PResFunReadParams(pbyte(Answer)+ResHeaderSize23);
ResData =PResFunReadItem(pbyte(ResParams)+sizeof(TResFunReadParams));
// Each packet cannot exceed the PDU length (in bytes) negotiated, and moreover
// we must ensure to transfer a "finite" number of item per PDU
MaxElements=(PDULength-sizeof(TS7ResHeader23)-sizeof(TResFunReadParams)-4) / WordSize;
TotElements=Job.Amount;
Start =Job.Start;
Offset =0;
Result =0;
while ((TotElements>0) && (Result==0))
{
NumElements=TotElements;
if (NumElements>MaxElements)
NumElements=MaxElements;
Target=pbyte(Job.pData)+Offset;
//----------------------------------------------- Read next slice-----
PDUH_out->P = 0x32; // Always 0x32
PDUH_out->PDUType = PduType_request; // 0x01
PDUH_out->AB_EX = 0x0000; // Always 0x0000
PDUH_out->Sequence = GetNextWord(); // AutoInc
PDUH_out->ParLen = SwapWord(RPSize); // 14 bytes params
PDUH_out->DataLen = 0x0000; // No data
ReqParams->FunRead = pduFuncRead; // 0x04
ReqParams->ItemsCount = 1;
ReqParams->Items[0].ItemHead[0] = 0x12;
ReqParams->Items[0].ItemHead[1] = 0x0A;
ReqParams->Items[0].ItemHead[2] = 0x10;
ReqParams->Items[0].TransportSize = Job.WordLen;
ReqParams->Items[0].Length = SwapWord(NumElements);
ReqParams->Items[0].Area = Job.Area;
if (Job.Area==S7AreaDB)
ReqParams->Items[0].DBNumber = SwapWord(Job.Number);
else
ReqParams->Items[0].DBNumber = 0x0000;
// Adjusts the offset
if ((Job.WordLen==S7WLBit) || (Job.WordLen==S7WLCounter) || (Job.WordLen==S7WLTimer))
Address = Start;
else
Address = Start*8;
ReqParams->Items[0].Address[2] = Address & 0x000000FF;
Address = Address >> 8;
ReqParams->Items[0].Address[1] = Address & 0x000000FF;
Address = Address >> 8;
ReqParams->Items[0].Address[0] = Address & 0x000000FF;
IsoSize = sizeof(TS7ReqHeader)+RPSize;
Result = isoExchangeBuffer(0,IsoSize);
// Get Data
if (Result==0) // 1St level Iso
{
Size = 0;
// Item level error
if (ResData->ReturnCode==0xFF) // <-- 0xFF means Result OK
{
// Calcs data size in bytes
Size = SwapWord(ResData->DataLength);
// Adjust Size in accord of TransportSize
if ((ResData->TransportSize != TS_ResOctet) && (ResData->TransportSize != TS_ResReal) && (ResData->TransportSize != TS_ResBit))
Size = Size >> 3;
memcpy(Target, &ResData->Data[0], Size);
}
else
Result = CpuError(ResData->ReturnCode);
Offset+=Size;
};
//--------------------------------------------------------------------
TotElements -= NumElements;
Start += NumElements*WordSize;
}
return Result;
}
//---------------------------------------------------------------------------
int TSnap7MicroClient::opWriteArea()
{
PReqFunWriteParams ReqParams;
PReqFunWriteDataItem ReqData; // only 1 item for WriteArea Function
PResFunWrite ResParams;
PS7ResHeader23 Answer;
word RPSize; // ReqParams size
word RHSize; // Request headers size
bool First = true;
pbyte Source;
pbyte Target;
int Address;
int IsoSize;
int WordSize;
word Size;
uintptr_t Offset = 0;
int Start; // where we are starting from for this telegram
int MaxElements; // Max elements that we can transfer in a PDU
word NumElements; // Num of elements that we are asking for this telegram
int TotElements; // Total elements requested
int Result = 0;
WordSize=DataSizeByte(Job.WordLen); // The size in bytes of an element that we are pushing
if (WordSize==0)
return errCliInvalidWordLen;
// First check : params bounds
if ((Job.Number<0) || (Job.Number>65535) || (Job.Start<0) || (Job.Amount<1))
return errCliInvalidParams;
// Second check : transport size
if ((Job.WordLen==S7WLBit) && (Job.Amount>1))
return errCliInvalidTransportSize;
RHSize =sizeof(TS7ReqHeader)+ // Request header
2+ // FunWrite+ItemCount (of TReqFunWriteParams)
sizeof(TReqFunWriteItem)+// 1 item reference
4; // ReturnCode+TransportSize+DataLength
RPSize =sizeof(TReqFunWriteItem)+2;
// Setup pointers (note : PDUH_out and PDU.Payload are the same pointer)
ReqParams=PReqFunWriteParams(pbyte(PDUH_out)+sizeof(TS7ReqHeader));
ReqData =PReqFunWriteDataItem(pbyte(ReqParams)+sizeof(TReqFunWriteItem)+2); // 2 = FunWrite+ItemsCount
Target =pbyte(ReqData)+4; // 4 = ReturnCode+TransportSize+DataLength
Answer =PS7ResHeader23(&PDU.Payload);
ResParams=PResFunWrite(pbyte(Answer)+ResHeaderSize23);
// Each packet cannot exceed the PDU length (in bytes) negotiated, and moreover
// we must ensure to transfer a "finite" number of item per PDU
MaxElements=(PDULength-RHSize) / WordSize;
TotElements=Job.Amount;
Start =Job.Start;
while ((TotElements>0) && (Result==0))
{
NumElements=TotElements;
if (NumElements>MaxElements)
NumElements=MaxElements;
Source=pbyte(Job.pData)+Offset;
Size=NumElements * WordSize;
PDUH_out->P=0x32; // Always 0x32
PDUH_out->PDUType=PduType_request; // 0x01
gitextract_8115zplp/
├── .github/
│ └── workflows/
│ └── test-and-release.yml
├── .gitignore
├── .npmignore
├── LICENSE
├── README.md
├── binding.gyp
├── deps/
│ └── snap7/
│ ├── HISTORY.txt
│ ├── gpl.txt
│ ├── lgpl-3.0.txt
│ └── src/
│ ├── core/
│ │ ├── s7_client.cpp
│ │ ├── s7_client.h
│ │ ├── s7_firmware.h
│ │ ├── s7_isotcp.cpp
│ │ ├── s7_isotcp.h
│ │ ├── s7_micro_client.cpp
│ │ ├── s7_micro_client.h
│ │ ├── s7_partner.cpp
│ │ ├── s7_partner.h
│ │ ├── s7_peer.cpp
│ │ ├── s7_peer.h
│ │ ├── s7_server.cpp
│ │ ├── s7_server.h
│ │ ├── s7_text.cpp
│ │ ├── s7_text.h
│ │ └── s7_types.h
│ ├── lib/
│ │ ├── snap7.def
│ │ ├── snap7_libmain.cpp
│ │ └── snap7_libmain.h
│ └── sys/
│ ├── snap_msgsock.cpp
│ ├── snap_msgsock.h
│ ├── snap_platform.h
│ ├── snap_sysutils.cpp
│ ├── snap_sysutils.h
│ ├── snap_tcpsrvr.cpp
│ ├── snap_tcpsrvr.h
│ ├── snap_threads.cpp
│ ├── snap_threads.h
│ ├── sol_threads.h
│ ├── unix_threads.h
│ └── win_threads.h
├── doc/
│ ├── client.md
│ └── server.md
├── lib/
│ └── node-snap7.js
├── package.json
└── src/
├── node_snap7.cpp
├── node_snap7_client.cpp
├── node_snap7_client.h
├── node_snap7_server.cpp
├── node_snap7_server.h
├── snap7.cpp
└── snap7.h
SYMBOL INDEX (558 symbols across 31 files)
FILE: deps/snap7/src/core/s7_client.h
function class (line 38) | class TClientThread: public TSnapThread
function class (line 50) | class TSnap7Client: public TSnap7MicroClient
type TSnap7Client (line 101) | typedef TSnap7Client *PSnap7Client;
FILE: deps/snap7/src/core/s7_isotcp.h
type TTPKT (line 65) | typedef struct{
type TCOPT_Params (line 72) | typedef struct {
type TCOTP_CO (line 96) | typedef struct {
type TCOTP_CO (line 149) | typedef TCOTP_CO *PCOTP_CO;
type TCOTP_DT (line 152) | typedef struct {
type TCOTP_DT (line 159) | typedef TCOTP_DT *PCOTP_DT;
type TIsoHeaderInfo (line 163) | typedef struct {
type TIsoHeaderInfo (line 169) | typedef TIsoHeaderInfo *PIsoHeaderInfo;
type TIsoControlPDU (line 183) | typedef struct {
type TIsoControlPDU (line 187) | typedef TIsoControlPDU *PIsoControlPDU;
type u_char (line 189) | typedef u_char TIsoPayload[IsoPayload_Size];
type TIsoDataPDU (line 191) | typedef struct {
type TIsoDataPDU (line 197) | typedef TIsoDataPDU *PIsoDataPDU;
type TIsoPayload (line 198) | typedef TIsoPayload *PIsoPayload;
type TPDUKind (line 200) | typedef enum {
function class (line 213) | class TIsoTcpSocket : public TMsgSocket
FILE: deps/snap7/src/core/s7_micro_client.cpp
type tm (line 823) | struct tm
function byte (line 1819) | byte TSnap7MicroClient::BCDtoByte(byte B)
function byte (line 1824) | byte TSnap7MicroClient::WordToBCD(word Value)
function longword (line 2488) | longword TSnap7MicroClient::DWordAt(void * P)
type tm (line 3108) | struct tm
FILE: deps/snap7/src/core/s7_micro_client.h
type TS7DataItem (line 78) | typedef struct{
type TS7ResultItems (line 89) | typedef TS7ResultItems *PS7ResultItems;
type TS7BlocksList (line 91) | typedef struct {
type TS7BlockInfo (line 101) | typedef struct {
type word (line 120) | typedef word TS7BlocksOfType[0x2000];
type TS7BlocksOfType (line 121) | typedef TS7BlocksOfType *PS7BlocksOfType;
type TS7OrderCode (line 123) | typedef struct {
type TS7CpuInfo (line 130) | typedef struct {
type TS7CpInfo (line 138) | typedef struct {
type SZL_HEADER (line 147) | typedef struct {
type TS7SZL (line 152) | typedef struct {
type TS7SZLList (line 158) | typedef struct {
type TS7Protection (line 164) | typedef struct {
type TSnap7Job (line 226) | struct TSnap7Job
function class (line 248) | class TSnap7MicroClient: public TSnap7Peer
type TSnap7MicroClient (line 361) | typedef TSnap7MicroClient *PSnap7MicroClient;
FILE: deps/snap7/src/core/s7_partner.cpp
function ServersManager_GetServer (line 32) | int ServersManager_GetServer(longword BindAddress, PConnectionServer &Se...
function ServersManager_RemovePartner (line 41) | void ServersManager_RemovePartner(PConnectionServer Server, PSnap7Partne...
function PSnap7Partner (line 271) | PSnap7Partner TConnectionServer::FindPartner(longword Address)
function byte (line 434) | byte TSnap7Partner::GetNextByte()
FILE: deps/snap7/src/core/s7_partner.h
type TSnap7Partner (line 71) | typedef TSnap7Partner *PSnap7Partner;
type TConnectionServer (line 74) | typedef TConnectionServer *PConnectionServer;
function class (line 79) | class TServersManager
type TServersManager (line 97) | typedef TServersManager *PServersManager;
function class (line 103) | class TConnListenerThread : public TSnapThread
type TConnListenerThread (line 117) | typedef TConnListenerThread *PConnListenerThread;
function class (line 120) | class TConnectionServer
type TConnectionServer (line 156) | typedef TConnectionServer * PConnectionServer;
function class (line 161) | class TPartnerThread : public TSnapThread
type TPartnerThread (line 178) | typedef TPartnerThread *PPartnerThread;
type TRecvStatus (line 183) | typedef struct{
type TRecvLast (line 193) | typedef struct{
function class (line 206) | class TSnap7Partner : public TSnap7Peer
FILE: deps/snap7/src/core/s7_peer.cpp
function word (line 58) | word TSnap7Peer::GetNextWord()
FILE: deps/snap7/src/core/s7_peer.h
function class (line 37) | class TSnap7Peer: public TIsoTcpSocket
FILE: deps/snap7/src/core/s7_server.cpp
function byte (line 131) | byte TS7Worker::BCD(word Value)
type tm (line 140) | struct tm
function word (line 283) | word TS7Worker::RA_NotFound(PResFunReadItem ResItem, TEv &EV)
function word (line 292) | word TS7Worker::RA_OutOfRange(PResFunReadItem ResItem, TEv &EV)
function word (line 301) | word TS7Worker::RA_SizeOverPDU(PResFunReadItem ResItem, TEv &EV)
function PS7Area (line 310) | PS7Area TS7Worker::GetArea(byte S7Code, word index)
function word (line 324) | word TS7Worker::ReadArea(PResFunReadItem ResItemData, PReqFunReadItem Re...
function byte (line 563) | byte TS7Worker::WA_NotFound(TEv &EV)
function byte (line 569) | byte TS7Worker::WA_InvalidTransportSize(TEv &EV)
function byte (line 575) | byte TS7Worker::WA_OutOfRange(TEv &EV)
function byte (line 581) | byte TS7Worker::WA_DataSizeMismatch(TEv &EV)
function byte (line 587) | byte TS7Worker::WriteArea(PReqFunWriteDataItem ReqItemData, PReqFunWrite...
function PWorkerSocket (line 1754) | PWorkerSocket TSnap7Server::CreateWorkerSocket(socket_t Sock)
function PS7Area (line 1763) | PS7Area TSnap7Server::FindDB(word DBNumber)
FILE: deps/snap7/src/core/s7_server.h
type TS7Area (line 58) | typedef struct{
function class (line 68) | class TIsoTcpWorker : public TIsoTcpSocket
type TSZL (line 85) | typedef struct{
type TEv (line 97) | typedef struct{
type TCB (line 106) | typedef struct{
function class (line 116) | class TS7Worker : public TIsoTcpWorker
type TS7Worker (line 199) | typedef TS7Worker *PS7Worker;
function class (line 210) | class TSnap7Server : public TCustomMsgServer
type TSnap7Server (line 258) | typedef TSnap7Server *PSnap7Server;
FILE: deps/snap7/src/core/s7_text.cpp
type tm (line 87) | struct tm
FILE: deps/snap7/src/core/s7_types.h
type tm (line 263) | typedef tm *PTimeStruct;
type TS7Tag (line 271) | typedef struct{
type TS7ReqHeader (line 280) | typedef struct {
type TS7ReqHeader (line 289) | typedef TS7ReqHeader* PS7ReqHeader;
type TS7ResHeader23 (line 292) | typedef struct{
type TS7ResHeader23 (line 302) | typedef TS7ResHeader23* PS7ResHeader23;
type TS7ResHeader17 (line 305) | typedef struct{
type TS7ResHeader17 (line 314) | typedef TS7ResHeader17* PS7ResHeader17;
type TS7ResHeader8 (line 317) | typedef struct {
type TS7ResHeader8 (line 326) | typedef TS7ResHeader8* PS7ResHeader8;
type TS7Answer23 (line 329) | typedef struct{
type TS7Answer23 (line 334) | typedef TS7Answer23* PS7Answer23;
type TS7Answer17 (line 337) | typedef struct {
type TS7Answer17 (line 342) | typedef TS7Answer17* PS7Answer17;
type byte (line 344) | typedef byte TTimeBuffer[8];
type byte (line 345) | typedef byte *PTimeBuffer[8];
type TS7Time (line 347) | typedef struct{
type byte (line 358) | typedef byte TS7Buffer[65536];
type byte (line 359) | typedef byte *PS7Buffer;
type TReqFunTypedParams (line 366) | typedef struct {
type TReqFunNegotiateParams (line 378) | typedef struct {
type TReqFunNegotiateParams (line 386) | typedef TReqFunNegotiateParams* PReqFunNegotiateParams;
type TResFunNegotiateParams (line 388) | typedef struct {
type TResFunNegotiateParams (line 396) | typedef TResFunNegotiateParams* PResFunNegotiateParams;
type TReqFunReadItem (line 401) | typedef struct {
type TReqFunReadParams (line 412) | typedef struct {
type TReqFunReadParams (line 418) | typedef TReqFunReadParams* PReqFunReadParams;
type TResFunReadParams (line 420) | typedef struct {
type TResFunReadParams (line 425) | typedef TResFunReadParams* PResFunReadParams;
type TResFunReadItem (line 427) | typedef struct {
type PResFunReadItem (line 434) | typedef PResFunReadItem TResFunReadData[MaxVars];
type TReqFunWriteItem (line 439) | typedef struct {
type TReqFunWriteParams (line 448) | typedef struct {
type TReqFunWriteParams (line 454) | typedef TReqFunWriteParams* PReqFunWriteParams;
type TReqFunWriteDataItem (line 456) | typedef struct {
type PReqFunWriteDataItem (line 463) | typedef PReqFunWriteDataItem TReqFunWriteData[MaxVars];
type TResFunWrite (line 465) | typedef struct {
type TResFunWrite (line 471) | typedef TResFunWrite* PResFunWrite;
type TReqFunStartUploadParams (line 476) | typedef struct {
type TReqFunStartUploadParams (line 488) | typedef TReqFunStartUploadParams* PReqFunStartUploadParams;
type TResFunStartUploadParams (line 490) | typedef struct {
type TResFunStartUploadParams (line 498) | typedef TResFunStartUploadParams* PResFunStartUploadParams;
type TReqFunUploadParams (line 500) | typedef struct {
type TReqFunUploadParams (line 506) | typedef TReqFunUploadParams* PReqFunUploadParams;
type TResFunUploadParams (line 508) | typedef struct {
type TResFunUploadParams (line 513) | typedef TResFunUploadParams* PResFunUploadParams;
type TResFunUploadDataHeaderFirst (line 515) | typedef struct {
type TResFunUploadDataHeaderFirst (line 538) | typedef TResFunUploadDataHeaderFirst* PResFunUploadDataHeaderFirst;
type TResFunUploadDataHeaderNext (line 540) | typedef struct {
type TResFunUploadDataHeaderNext (line 546) | typedef TResFunUploadDataHeaderNext* PResFunUploadDataHeaderNext;
type TResFunUploadDataHeader (line 548) | typedef struct {
type TResFunUploadDataHeader (line 554) | typedef TResFunUploadDataHeader* PResFunUploadDataHeader;
type TArrayUpldFooter (line 556) | typedef struct {
type TArrayUpldFooter (line 578) | typedef TArrayUpldFooter* PArrayUpldFooter;
type TReqFunEndUploadParams (line 580) | typedef struct {
type TReqFunEndUploadParams (line 586) | typedef TReqFunEndUploadParams* PReqFunEndUploadParams;
type TResFunEndUploadParams (line 588) | typedef struct {
type TResFunEndUploadParams (line 592) | typedef TResFunEndUploadParams* PResFunEndUploadParams;
type TReqStartDownloadParams (line 597) | typedef struct {
type TReqStartDownloadParams (line 613) | typedef TReqStartDownloadParams* PReqStartDownloadParams;
type byte (line 614) | typedef byte TResStartDownloadParams;
type TResStartDownloadParams (line 615) | typedef TResStartDownloadParams* PResStartDownloadParams;
type TReqDownloadParams (line 617) | typedef struct {
type TReqDownloadParams (line 628) | typedef TReqDownloadParams* PReqDownloadParams;
type TResDownloadParams (line 630) | typedef struct {
type TResDownloadParams (line 635) | typedef TResDownloadParams* PResDownloadParams;
type TResDownloadDataHeader (line 637) | typedef struct {
type TResDownloadDataHeader (line 642) | typedef TResDownloadDataHeader* PResDownloadDataHeader;
type byte (line 643) | typedef byte TResEndDownloadParams;
type TResEndDownloadParams (line 644) | typedef TResEndDownloadParams* PResEndDownloadParams;
type TS7CompactBlockInfo (line 646) | typedef struct {
type TS7CompactBlockInfo (line 665) | typedef TS7CompactBlockInfo* PS7CompactBlockInfo;
type TS7BlockFooter (line 667) | typedef struct {
type TS7BlockFooter (line 678) | typedef TS7BlockFooter* PS7BlockFooter;
type TReqControlBlockParams (line 683) | typedef struct {
type TReqControlBlockParams (line 697) | typedef TReqControlBlockParams* PReqControlBlockParams;
type TReqFunPlcStop (line 702) | typedef struct {
type TReqFunPlcStop (line 709) | typedef TReqFunPlcStop* PReqFunPlcStop;
type TReqFunPlcHotStart (line 711) | typedef struct {
type TReqFunPlcHotStart (line 719) | typedef TReqFunPlcHotStart* PReqFunPlcHotStart;
type TReqFunPlcColdStart (line 721) | typedef struct {
type TReqFunPlcColdStart (line 730) | typedef TReqFunPlcColdStart* PReqFunPlcColdStart;
type TReqFunCopyRamToRom (line 732) | typedef struct {
type TReqFunCopyRamToRom (line 741) | typedef TReqFunCopyRamToRom* PReqFunCopyRamToRom;
type TReqFunCompress (line 743) | typedef struct {
type TReqFunCompress (line 751) | typedef TReqFunCompress* PReqFunCompress;
type TResFunCtrl (line 753) | typedef struct {
type TResFunCtrl (line 758) | typedef TResFunCtrl* PResFunCtrl;
type TS7Params7 (line 763) | typedef struct {
type TS7Params7 (line 774) | typedef TS7Params7* PS7ReqParams7;
type TS7Params7 (line 775) | typedef TS7Params7* PS7ResParams7;
type TReqFunTypedParams (line 790) | typedef TReqFunTypedParams TReqFunSecurity;
type TReqFunSecurity (line 791) | typedef TReqFunSecurity* PReqFunSecurity;
type TReqDataSecurity (line 795) | typedef struct {
type TReqDataSecurity (line 802) | typedef TReqDataSecurity* PReqDataSecurity;
type TS7Params7 (line 803) | typedef TS7Params7 TResParamsSecurity;
type TResParamsSecurity (line 804) | typedef TResParamsSecurity* PResParamsSecurity;
type TResDataSecurity (line 806) | typedef struct {
type TResDataSecurity (line 812) | typedef TResDataSecurity* PResDataSecurity;
type TReqFunTypedParams (line 817) | typedef TReqFunTypedParams TReqFunReadSZLFirst;
type TReqFunReadSZLFirst (line 818) | typedef TReqFunReadSZLFirst* PReqFunReadSZLFirst;
type TReqFunReadSZLNext (line 820) | typedef struct {
type TReqFunReadSZLNext (line 831) | typedef TReqFunReadSZLNext* PReqFunReadSZLNext;
type TS7ReqSZLData (line 833) | typedef struct {
type TS7ReqSZLData (line 841) | typedef TS7ReqSZLData* PS7ReqSZLData;
type TS7ResSZLDataFirst (line 843) | typedef struct {
type TS7ResSZLDataFirst (line 854) | typedef TS7ResSZLDataFirst* PS7ResSZLDataFirst;
type TS7ResSZLDataNext (line 856) | typedef struct {
type TS7ResSZLDataNext (line 863) | typedef TS7ResSZLDataNext* PS7ResSZLDataNext;
type TS7ResSZLData_0 (line 865) | typedef struct {
type TS7ResSZLData_0 (line 872) | typedef TS7ResSZLData_0* PS7ResSZLData_0;
type TReqFunTypedParams (line 877) | typedef TReqFunTypedParams TReqFunDateTime;
type TReqFunDateTime (line 878) | typedef TReqFunDateTime* PReqFunDateTime;
type byte (line 880) | typedef byte TReqDataGetDateTime[4];
type longword (line 882) | typedef longword *PReqDataGetDateTime;
type TResDataGetTime (line 884) | typedef struct {
type TResDataGetTime (line 893) | typedef TResDataGetTime* PResDataGetTime;
type TResDataGetTime (line 894) | typedef TResDataGetTime TReqDataSetTime;
type TReqDataSetTime (line 895) | typedef TReqDataSetTime* PReqDataSetTime;
type TResDataSetTime (line 897) | typedef struct {
type TResDataSetTime (line 903) | typedef TResDataSetTime* PResDataSetTime;
type TReqFunTypedParams (line 908) | typedef TReqFunTypedParams TReqFunGetBlockInfo;
type TReqFunGetBlockInfo (line 909) | typedef TReqFunGetBlockInfo* PReqFunGetBlockInfo;
type byte (line 911) | typedef byte TReqDataFunBlocks[4];
type u_char (line 912) | typedef u_char* PReqDataFunBlocks;
type TResFunGetBlockInfo (line 914) | typedef struct {
type TResFunGetBlockInfo (line 925) | typedef TResFunGetBlockInfo* PResFunGetBlockInfo;
type TResFunGetBlockItem (line 927) | typedef struct {
type TDataFunListAll (line 933) | typedef struct {
type TDataFunListAll (line 940) | typedef TDataFunListAll* PDataFunListAll;
type TDataFunGetBotItem (line 942) | typedef struct {
type TDataFunGetBot (line 948) | typedef struct {
type TDataFunGetBot (line 956) | typedef TDataFunGetBot* PDataFunGetBot;
type TReqDataBlockOfType (line 958) | typedef struct {
type TReqDataBlockOfType (line 966) | typedef TReqDataBlockOfType* PReqDataBlockOfType;
type TReqDataBlockInfo (line 968) | typedef struct {
type TReqDataBlockInfo (line 978) | typedef TReqDataBlockInfo* PReqDataBlockInfo;
type TResDataBlockInfo (line 980) | typedef struct {
type TResDataBlockInfo (line 1014) | typedef TResDataBlockInfo* PResDataBlockInfo;
type TPendingBuffer (line 1019) | typedef struct {
type TPacketInfo (line 1025) | typedef struct {
type TBSendParams (line 1032) | typedef struct {
type TBSendParams (line 1044) | typedef TBSendParams* PBSendReqParams;
type TBSendParams (line 1045) | typedef TBSendParams* PBSendResParams;
type TBsendRequestData (line 1049) | typedef struct {
type TBsendRequestData (line 1057) | typedef TBsendRequestData* PBsendRequestData;
type TBSendResData (line 1059) | typedef struct {
type TBSendResData (line 1063) | typedef TBSendResData* PBSendResData;
FILE: deps/snap7/src/lib/snap7_libmain.cpp
function libinit (line 35) | void libinit(void)
function libdone (line 41) | void libdone(void)
function BOOL (line 47) | BOOL APIENTRY DllMain (HINSTANCE hInst,
function S7Object (line 71) | S7Object S7API Cli_Create()
function Cli_Destroy (line 76) | void S7API Cli_Destroy(S7Object &Client)
function Cli_SetConnectionParams (line 85) | int S7API Cli_SetConnectionParams(S7Object Client, const char *Address, ...
function Cli_SetConnectionType (line 96) | int S7API Cli_SetConnectionType(S7Object Client, word ConnectionType)
function Cli_ConnectTo (line 107) | int S7API Cli_ConnectTo(S7Object Client, const char *Address, int Rack, ...
function Cli_Connect (line 115) | int S7API Cli_Connect(S7Object Client)
function Cli_Disconnect (line 123) | int S7API Cli_Disconnect(S7Object Client)
function Cli_GetParam (line 131) | int S7API Cli_GetParam(S7Object Client, int ParamNumber, void *pValue)
function Cli_SetParam (line 139) | int S7API Cli_SetParam(S7Object Client, int ParamNumber, void *pValue)
function Cli_SetAsCallback (line 147) | int S7API Cli_SetAsCallback(S7Object Client, pfn_CliCompletion pCompleti...
function Cli_ReadArea (line 155) | int S7API Cli_ReadArea(S7Object Client, int Area, int DBNumber, int Star...
function Cli_WriteArea (line 163) | int S7API Cli_WriteArea(S7Object Client, int Area, int DBNumber, int Sta...
function Cli_ReadMultiVars (line 171) | int S7API Cli_ReadMultiVars(S7Object Client, PS7DataItem Item, int Items...
function Cli_WriteMultiVars (line 179) | int S7API Cli_WriteMultiVars(S7Object Client, PS7DataItem Item, int Item...
function Cli_DBRead (line 187) | int S7API Cli_DBRead(S7Object Client, int DBNumber, int Start, int Size,...
function Cli_DBWrite (line 195) | int S7API Cli_DBWrite(S7Object Client, int DBNumber, int Start, int Size...
function Cli_MBRead (line 203) | int S7API Cli_MBRead(S7Object Client, int Start, int Size, void *pUsrData)
function Cli_MBWrite (line 211) | int S7API Cli_MBWrite(S7Object Client, int Start, int Size, void *pUsrData)
function Cli_EBRead (line 219) | int S7API Cli_EBRead(S7Object Client, int Start, int Size, void *pUsrData)
function Cli_EBWrite (line 227) | int S7API Cli_EBWrite(S7Object Client, int Start, int Size, void *pUsrData)
function Cli_ABRead (line 235) | int S7API Cli_ABRead(S7Object Client, int Start, int Size, void *pUsrData)
function Cli_ABWrite (line 243) | int S7API Cli_ABWrite(S7Object Client, int Start, int Size, void *pUsrData)
function Cli_TMRead (line 251) | int S7API Cli_TMRead(S7Object Client, int Start, int Amount, void *pUsrD...
function Cli_TMWrite (line 259) | int S7API Cli_TMWrite(S7Object Client, int Start, int Amount, void *pUsr...
function Cli_CTRead (line 267) | int S7API Cli_CTRead(S7Object Client, int Start, int Amount, void *pUsrD...
function Cli_CTWrite (line 275) | int S7API Cli_CTWrite(S7Object Client, int Start, int Amount, void *pUsr...
function Cli_ListBlocks (line 283) | int S7API Cli_ListBlocks(S7Object Client, TS7BlocksList *pUsrData)
function Cli_GetAgBlockInfo (line 291) | int S7API Cli_GetAgBlockInfo(S7Object Client, int BlockType, int BlockNu...
function Cli_GetPgBlockInfo (line 299) | int S7API Cli_GetPgBlockInfo(S7Object Client, void *pBlock, TS7BlockInfo...
function Cli_ListBlocksOfType (line 307) | int S7API Cli_ListBlocksOfType(S7Object Client, int BlockType, TS7Blocks...
function Cli_Upload (line 315) | int S7API Cli_Upload(S7Object Client, int BlockType, int BlockNum, void ...
function Cli_FullUpload (line 323) | int S7API Cli_FullUpload(S7Object Client, int BlockType, int BlockNum, v...
function Cli_Download (line 331) | int S7API Cli_Download(S7Object Client, int BlockNum, void *pUsrData, in...
function Cli_Delete (line 339) | int S7API Cli_Delete(S7Object Client, int BlockType, int BlockNum)
function Cli_DBGet (line 347) | int S7API Cli_DBGet(S7Object Client, int DBNumber, void *pUsrData, int &...
function Cli_DBFill (line 355) | int S7API Cli_DBFill(S7Object Client, int DBNumber, int FillChar)
function Cli_GetPlcDateTime (line 363) | int S7API Cli_GetPlcDateTime(S7Object Client, tm &DateTime)
function Cli_SetPlcDateTime (line 371) | int S7API Cli_SetPlcDateTime(S7Object Client, tm *DateTime)
function Cli_SetPlcSystemDateTime (line 379) | int S7API Cli_SetPlcSystemDateTime(S7Object Client)
function Cli_GetOrderCode (line 387) | int S7API Cli_GetOrderCode(S7Object Client, TS7OrderCode *pUsrData)
function Cli_GetCpuInfo (line 395) | int S7API Cli_GetCpuInfo(S7Object Client, TS7CpuInfo *pUsrData)
function Cli_GetCpInfo (line 403) | int S7API Cli_GetCpInfo(S7Object Client, TS7CpInfo *pUsrData)
function Cli_ReadSZL (line 411) | int S7API Cli_ReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsrDa...
function Cli_ReadSZLList (line 419) | int S7API Cli_ReadSZLList(S7Object Client, TS7SZLList *pUsrData, int &It...
function Cli_PlcHotStart (line 427) | int S7API Cli_PlcHotStart(S7Object Client)
function Cli_PlcColdStart (line 435) | int S7API Cli_PlcColdStart(S7Object Client)
function Cli_PlcStop (line 443) | int S7API Cli_PlcStop(S7Object Client)
function Cli_CopyRamToRom (line 451) | int S7API Cli_CopyRamToRom(S7Object Client, int Timeout)
function Cli_Compress (line 459) | int S7API Cli_Compress(S7Object Client, int Timeout)
function Cli_GetPlcStatus (line 467) | int S7API Cli_GetPlcStatus(S7Object Client, int &Status)
function Cli_GetProtection (line 475) | int S7API Cli_GetProtection(S7Object Client, TS7Protection *pUsrData)
function Cli_SetSessionPassword (line 483) | int S7API Cli_SetSessionPassword(S7Object Client, char *Password)
function Cli_ClearSessionPassword (line 491) | int S7API Cli_ClearSessionPassword(S7Object Client)
function Cli_IsoExchangeBuffer (line 499) | int S7API Cli_IsoExchangeBuffer(S7Object Client, void *pUsrData, int &Size)
function Cli_GetExecTime (line 507) | int S7API Cli_GetExecTime(S7Object Client, int &Time)
function Cli_GetLastError (line 518) | int S7API Cli_GetLastError(S7Object Client, int &LastError)
function Cli_GetPduLength (line 529) | int S7API Cli_GetPduLength(S7Object Client, int &Requested, int &Negotia...
function Cli_ErrorText (line 541) | int S7API Cli_ErrorText(int Error, char *Text, int TextLen)
function Cli_GetConnected (line 553) | int S7API Cli_GetConnected(S7Object Client, int &Connected)
function Cli_AsReadArea (line 565) | int S7API Cli_AsReadArea(S7Object Client, int Area, int DBNumber, int St...
function Cli_AsWriteArea (line 573) | int S7API Cli_AsWriteArea(S7Object Client, int Area, int DBNumber, int S...
function Cli_AsDBRead (line 581) | int S7API Cli_AsDBRead(S7Object Client, int DBNumber, int Start, int Siz...
function Cli_AsDBWrite (line 589) | int S7API Cli_AsDBWrite(S7Object Client, int DBNumber, int Start, int Si...
function Cli_AsMBRead (line 597) | int S7API Cli_AsMBRead(S7Object Client, int Start, int Size, void *pUsrD...
function Cli_AsMBWrite (line 605) | int S7API Cli_AsMBWrite(S7Object Client, int Start, int Size, void *pUsr...
function Cli_AsEBRead (line 613) | int S7API Cli_AsEBRead(S7Object Client, int Start, int Size, void *pUsrD...
function Cli_AsEBWrite (line 621) | int S7API Cli_AsEBWrite(S7Object Client, int Start, int Size, void *pUsr...
function Cli_AsABRead (line 629) | int S7API Cli_AsABRead(S7Object Client, int Start, int Size, void *pUsrD...
function Cli_AsABWrite (line 637) | int S7API Cli_AsABWrite(S7Object Client, int Start, int Size, void *pUsr...
function Cli_AsTMRead (line 645) | int S7API Cli_AsTMRead(S7Object Client, int Start, int Amount, void *pUs...
function Cli_AsTMWrite (line 653) | int S7API Cli_AsTMWrite(S7Object Client, int Start, int Amount, void *pU...
function Cli_AsCTRead (line 661) | int S7API Cli_AsCTRead(S7Object Client, int Start, int Amount, void *pUs...
function Cli_AsCTWrite (line 669) | int S7API Cli_AsCTWrite(S7Object Client, int Start, int Amount, void *pU...
function Cli_AsListBlocksOfType (line 677) | int S7API Cli_AsListBlocksOfType(S7Object Client, int BlockType, TS7Bloc...
function Cli_AsReadSZL (line 685) | int S7API Cli_AsReadSZL(S7Object Client, int ID, int Index, TS7SZL *pUsr...
function Cli_AsReadSZLList (line 693) | int S7API Cli_AsReadSZLList(S7Object Client, TS7SZLList *pUsrData, int &...
function Cli_AsUpload (line 701) | int S7API Cli_AsUpload(S7Object Client, int BlockType, int BlockNum, voi...
function Cli_AsFullUpload (line 709) | int S7API Cli_AsFullUpload(S7Object Client, int BlockType, int BlockNum,...
function Cli_AsDownload (line 717) | int S7API Cli_AsDownload(S7Object Client, int BlockNum, void *pUsrData, ...
function Cli_AsCopyRamToRom (line 725) | int S7API Cli_AsCopyRamToRom(S7Object Client, int Timeout)
function Cli_AsCompress (line 733) | int S7API Cli_AsCompress(S7Object Client, int Timeout)
function Cli_AsDBGet (line 741) | int S7API Cli_AsDBGet(S7Object Client, int DBNumber, void *pUsrData, int...
function Cli_AsDBFill (line 749) | int S7API Cli_AsDBFill(S7Object Client, int DBNumber, int FillChar)
function Cli_CheckAsCompletion (line 757) | int S7API Cli_CheckAsCompletion(S7Object Client, int &opResult)
function Cli_WaitAsCompletion (line 770) | int S7API Cli_WaitAsCompletion(S7Object Client, int Timeout)
function S7Object (line 780) | S7Object S7API Srv_Create()
function Srv_Destroy (line 785) | void S7API Srv_Destroy(S7Object &Server)
function Srv_GetParam (line 794) | int S7API Srv_GetParam(S7Object Server, int ParamNumber, void *pValue)
function Srv_SetParam (line 802) | int S7API Srv_SetParam(S7Object Server, int ParamNumber, void *pValue)
function Srv_StartTo (line 810) | int S7API Srv_StartTo(S7Object Server, const char *Address)
function Srv_Start (line 818) | int S7API Srv_Start(S7Object Server)
function Srv_Stop (line 826) | int S7API Srv_Stop(S7Object Server)
function Srv_RegisterArea (line 837) | int S7API Srv_RegisterArea(S7Object Server, int AreaCode, word Index, vo...
function Srv_UnregisterArea (line 845) | int S7API Srv_UnregisterArea(S7Object Server, int AreaCode, word Index)
function Srv_LockArea (line 853) | int S7API Srv_LockArea(S7Object Server, int AreaCode, word Index)
function Srv_UnlockArea (line 861) | int S7API Srv_UnlockArea(S7Object Server, int AreaCode, word Index)
function Srv_GetStatus (line 869) | int S7API Srv_GetStatus(S7Object Server, int &ServerStatus, int &CpuStat...
function Srv_SetCpuStatus (line 882) | int S7API Srv_SetCpuStatus(S7Object Server, int CpuStatus)
function Srv_ErrorText (line 893) | int S7API Srv_ErrorText(int Error, char *Text, int TextLen)
function Srv_EventText (line 905) | int S7API Srv_EventText(TSrvEvent &Event, char *Text, int TextLen)
function Srv_PickEvent (line 917) | int S7API Srv_PickEvent(S7Object Server, TSrvEvent *pEvent, int &EvtReady)
function Srv_ClearEvents (line 929) | int S7API Srv_ClearEvents(S7Object Server)
function Srv_GetMask (line 940) | int S7API Srv_GetMask(S7Object Server, int MaskKind, longword &Mask)
function Srv_SetMask (line 960) | int S7API Srv_SetMask(S7Object Server, int MaskKind, longword Mask)
function Srv_SetEventsCallback (line 979) | int S7API Srv_SetEventsCallback(S7Object Server, pfn_SrvCallBack pCallba...
function Srv_SetReadEventsCallback (line 987) | int S7API Srv_SetReadEventsCallback(S7Object Server, pfn_SrvCallBack pCa...
function Srv_SetRWAreaCallback (line 995) | int S7API Srv_SetRWAreaCallback(S7Object Server, pfn_RWAreaCallBack pCal...
function S7Object (line 1005) | S7Object S7API Par_Create(int Active)
function Par_Destroy (line 1010) | void S7API Par_Destroy(S7Object &Partner)
function Par_GetParam (line 1019) | int S7API Par_GetParam(S7Object Partner, int ParamNumber, void *pValue)
function Par_SetParam (line 1027) | int S7API Par_SetParam(S7Object Partner, int ParamNumber, void *pValue)
function Par_StartTo (line 1035) | int S7API Par_StartTo(S7Object Partner, const char *LocalAddress, const ...
function Par_Start (line 1044) | int S7API Par_Start(S7Object Partner)
function Par_Stop (line 1052) | int S7API Par_Stop(S7Object Partner)
function Par_BSend (line 1060) | int S7API Par_BSend(S7Object Partner, longword R_ID, void *pUsrData, int...
function Par_AsBSend (line 1068) | int S7API Par_AsBSend(S7Object Partner, longword R_ID, void *pUsrData, i...
function Par_CheckAsBSendCompletion (line 1076) | int S7API Par_CheckAsBSendCompletion(S7Object Partner, int &opResult)
function Par_WaitAsBSendCompletion (line 1089) | int S7API Par_WaitAsBSendCompletion(S7Object Partner, longword Timeout)
function Par_SetSendCallback (line 1097) | int S7API Par_SetSendCallback(S7Object Partner, pfn_ParBSendCompletion p...
function Par_BRecv (line 1105) | int S7API Par_BRecv(S7Object Partner, longword &R_ID, void *pData, int &...
function Par_CheckAsBRecvCompletion (line 1113) | int S7API Par_CheckAsBRecvCompletion(S7Object Partner, int &opResult, lo...
function Par_SetRecvCallback (line 1127) | int S7API Par_SetRecvCallback(S7Object Partner, pfn_ParBRecvCallBack pCo...
function Par_GetTimes (line 1135) | int S7API Par_GetTimes(S7Object Partner, longword &SendTime, longword &R...
function Par_GetStats (line 1148) | int S7API Par_GetStats(S7Object Partner, longword &BytesSent, longword &...
function Par_GetLastError (line 1163) | int S7API Par_GetLastError(S7Object Partner, int &LastError)
function Par_GetStatus (line 1174) | int S7API Par_GetStatus(S7Object Partner, int &Status)
function Par_ErrorText (line 1185) | int S7API Par_ErrorText(int Error, char *Text, int TextLen)
FILE: deps/snap7/src/lib/snap7_libmain.h
type S7Object (line 38) | typedef uintptr_t S7Object;
FILE: deps/snap7/src/sys/snap_msgsock.cpp
function word (line 42) | word TSnapBase::SwapWord(word Value)
function longword (line 50) | longword TSnapBase::SwapDWord(longword Value)
function Msg_CloseSocket (line 58) | void Msg_CloseSocket(socket_t FSocket)
function longword (line 67) | longword Msg_GetSockAddr(socket_t FSocket)
type sockaddr (line 136) | struct sockaddr
type sockaddr (line 147) | struct sockaddr
type timeval (line 343) | struct timeval
type sockaddr (line 353) | struct sockaddr
type sockaddr (line 434) | struct sockaddr
type sockaddr (line 485) | struct sockaddr
function socket_t (line 519) | socket_t TMsgSocket::SckAccept()
function IcmpInit (line 670) | bool IcmpInit()
function IcmpDone (line 694) | void IcmpDone()
function word (line 741) | word TRawSocketPinger::PacketChecksum()
type sockaddr (line 795) | struct sockaddr
type sockaddr (line 798) | struct sockaddr
function RawSocketsCheck (line 877) | bool RawSocketsCheck()
FILE: deps/snap7/src/sys/snap_msgsock.h
type SOCKET (line 62) | typedef SOCKET socket_t;
type socket_t (line 64) | typedef int socket_t;
type byte (line 127) | typedef byte TIcmpBuffer[ICmpBufferSize];
type TIPHeader (line 157) | typedef struct{
type TIcmpHeader (line 170) | typedef struct{
type TIcmpPacket (line 178) | typedef struct{
type TIcmpReply (line 183) | typedef struct{
function class (line 190) | class TRawSocketPinger
type TRawSocketPinger (line 205) | typedef TRawSocketPinger *PRawSocketPinger;
function class (line 207) | class TPinger
type TPinger (line 222) | typedef TPinger *PPinger;
function class (line 224) | class TSnapBase // base class endian-aware
function class (line 235) | class TMsgSocket : public TSnapBase
type TMsgSocket (line 323) | typedef TMsgSocket *PMsgSocket;
function class (line 328) | class SocketsLayer
FILE: deps/snap7/src/sys/snap_platform.h
type byte (line 140) | typedef uint8_t byte;
type word (line 141) | typedef uint16_t word;
type longword (line 142) | typedef uint32_t longword;
type byte (line 143) | typedef byte *pbyte;
type word (line 144) | typedef word *pword;
type snap_obj (line 145) | typedef uintptr_t snap_obj;
FILE: deps/snap7/src/sys/snap_sysutils.cpp
function clock_gettime (line 30) | int clock_gettime(int clk_id, struct timespec* t)
function longword (line 42) | longword SysGetTick()
function SysSleep (line 53) | void SysSleep(longword Delay_ms)
function longword (line 65) | longword DeltaTime(longword &Elapsed)
FILE: deps/snap7/src/sys/snap_tcpsrvr.cpp
function PWorkerSocket (line 317) | PWorkerSocket TCustomMsgServer::CreateWorkerSocket(socket_t Sock)
FILE: deps/snap7/src/sys/snap_tcpsrvr.h
type TSrvEvent (line 67) | typedef struct{
function class (line 87) | class TMsgEventQueue
type TMsgEventQueue (line 105) | typedef TMsgEventQueue *PMsgEventQueue;
function class (line 113) | class TMsgWorkerThread : public TSnapThread
type TMsgWorkerThread (line 125) | typedef TMsgWorkerThread *PMsgWorkerThread;
function class (line 131) | class TMsgListenerThread : public TSnapThread
type TMsgListenerThread (line 140) | typedef TMsgListenerThread *PMsgListenerThread;
type TMsgSocket (line 145) | typedef TMsgSocket *PWorkerSocket;
function class (line 147) | class TCustomMsgServer
function class (line 222) | class TEcoTcpWorker : public TMsgSocket
FILE: deps/snap7/src/sys/snap_threads.cpp
function longword (line 149) | longword TSnapThread::WaitFor(uint64_t Timeout)
FILE: deps/snap7/src/sys/sol_threads.h
function class (line 39) | class TSnapCriticalSection {
type TSnapCriticalSection (line 65) | typedef TSnapCriticalSection *PSnapCriticalSection;
function class (line 73) | class TSnapEvent {
function Set (line 95) | void Set()
function Reset (line 106) | void Reset()
function longword (line 113) | longword WaitForever()
function longword (line 124) | longword WaitFor(int64_t Timeout)
type TSnapEvent (line 159) | typedef TSnapEvent *PSnapEvent;
function class (line 162) | class TSnapThread {
type TSnapThread (line 205) | typedef TSnapThread *PSnapThread;
FILE: deps/snap7/src/sys/unix_threads.h
function class (line 39) | class TSnapCriticalSection
type TSnapCriticalSection (line 83) | typedef TSnapCriticalSection *PSnapCriticalSection;
function class (line 91) | class TSnapEvent
function Set (line 114) | void Set()
function Reset (line 125) | void Reset()
function longword (line 132) | longword WaitForever()
function longword (line 143) | longword WaitFor(int64_t Timeout)
type TSnapEvent (line 178) | typedef TSnapEvent *PSnapEvent;
function class (line 180) | class TSnapThread
type TSnapThread (line 225) | typedef TSnapThread *PSnapThread;
FILE: deps/snap7/src/sys/win_threads.h
function class (line 37) | class TSnapCriticalSection
type TSnapCriticalSection (line 68) | typedef TSnapCriticalSection *PSnapCriticalSection;
function class (line 71) | class TSnapEvent
function Set (line 88) | void Set()
function Reset (line 94) | void Reset()
function longword (line 100) | longword WaitForever()
function longword (line 108) | longword WaitFor(int64_t Timeout) {
type TSnapEvent (line 115) | typedef TSnapEvent *PSnapEvent;
function class (line 118) | class TSnapThread {
type TSnapThread (line 156) | typedef TSnapThread *PSnapThread;
FILE: src/node_snap7.cpp
type node_snap7 (line 9) | namespace node_snap7 {
function NAN_MODULE_INIT (line 11) | NAN_MODULE_INIT(InitAll) {
FILE: src/node_snap7_client.cpp
type node_snap7 (line 10) | namespace node_snap7 {
function NAN_MODULE_INIT (line 14) | NAN_MODULE_INIT(S7Client::Init) {
function NAN_METHOD (line 700) | NAN_METHOD(S7Client::New) {
function NAN_METHOD (line 752) | NAN_METHOD(S7Client::Connect) {
function NAN_METHOD (line 765) | NAN_METHOD(S7Client::ConnectTo) {
function NAN_METHOD (line 792) | NAN_METHOD(S7Client::SetConnectionParams) {
function NAN_METHOD (line 811) | NAN_METHOD(S7Client::SetConnectionType) {
function NAN_METHOD (line 824) | NAN_METHOD(S7Client::Disconnect) {
function NAN_METHOD (line 831) | NAN_METHOD(S7Client::GetParam) {
function NAN_METHOD (line 849) | NAN_METHOD(S7Client::SetParam) {
function NAN_METHOD (line 1255) | NAN_METHOD(S7Client::ReadArea) {
function NAN_METHOD (line 1298) | NAN_METHOD(S7Client::WriteArea) {
function NAN_METHOD (line 1325) | NAN_METHOD(S7Client::ReadMultiVars) {
function NAN_METHOD (line 1455) | NAN_METHOD(S7Client::WriteMultiVars) {
function NAN_METHOD (line 1541) | NAN_METHOD(S7Client::ListBlocks) {
function NAN_METHOD (line 1591) | NAN_METHOD(S7Client::GetAgBlockInfo) {
function NAN_METHOD (line 1621) | NAN_METHOD(S7Client::GetPgBlockInfo) {
function NAN_METHOD (line 1682) | NAN_METHOD(S7Client::ListBlocksOfType) {
function NAN_METHOD (line 1727) | NAN_METHOD(S7Client::Upload) {
function NAN_METHOD (line 1760) | NAN_METHOD(S7Client::FullUpload) {
function NAN_METHOD (line 1793) | NAN_METHOD(S7Client::Download) {
function NAN_METHOD (line 1813) | NAN_METHOD(S7Client::Delete) {
function NAN_METHOD (line 1831) | NAN_METHOD(S7Client::DBGet) {
function NAN_METHOD (line 1864) | NAN_METHOD(S7Client::DBFill) {
function NAN_METHOD (line 1891) | NAN_METHOD(S7Client::GetPlcDateTime) {
function NAN_METHOD (line 1912) | NAN_METHOD(S7Client::SetPlcDateTime) {
function NAN_METHOD (line 1953) | NAN_METHOD(S7Client::SetPlcSystemDateTime) {
function NAN_METHOD (line 1967) | NAN_METHOD(S7Client::GetOrderCode) {
function NAN_METHOD (line 2007) | NAN_METHOD(S7Client::GetCpuInfo) {
function NAN_METHOD (line 2048) | NAN_METHOD(S7Client::GetCpInfo) {
function NAN_METHOD (line 2086) | NAN_METHOD(S7Client::ReadSZL) {
function NAN_METHOD (line 2120) | NAN_METHOD(S7Client::ReadSZLList) {
function NAN_METHOD (line 2157) | NAN_METHOD(S7Client::PlcHotStart) {
function NAN_METHOD (line 2170) | NAN_METHOD(S7Client::PlcColdStart) {
function NAN_METHOD (line 2183) | NAN_METHOD(S7Client::PlcStop) {
function NAN_METHOD (line 2196) | NAN_METHOD(S7Client::CopyRamToRom) {
function NAN_METHOD (line 2214) | NAN_METHOD(S7Client::Compress) {
function NAN_METHOD (line 2233) | NAN_METHOD(S7Client::GetProtection) {
function NAN_METHOD (line 2277) | NAN_METHOD(S7Client::SetSessionPassword) {
function NAN_METHOD (line 2298) | NAN_METHOD(S7Client::ClearSessionPassword) {
function NAN_METHOD (line 2312) | NAN_METHOD(S7Client::ExecTime) {
function NAN_METHOD (line 2323) | NAN_METHOD(S7Client::LastError) {
function NAN_METHOD (line 2330) | NAN_METHOD(S7Client::PDURequested) {
function NAN_METHOD (line 2341) | NAN_METHOD(S7Client::PDULength) {
function NAN_METHOD (line 2352) | NAN_METHOD(S7Client::PlcStatus) {
function NAN_METHOD (line 2371) | NAN_METHOD(S7Client::Connected) {
function NAN_METHOD (line 2378) | NAN_METHOD(S7Client::ErrorText) {
FILE: src/node_snap7_client.h
function namespace (line 13) | namespace node_snap7 {
FILE: src/node_snap7_server.cpp
type rw_event_baton_t (line 17) | struct rw_event_baton_t {
function EventCallBack (line 24) | void S7API EventCallBack(void *usrPtr, PSrvEvent PEvent, int Size) {
function RWAreaCallBack (line 32) | int S7API RWAreaCallBack(void *usrPtr, int Sender, int Operation, PS7Tag...
function NAN_MODULE_INIT (line 51) | NAN_MODULE_INIT(S7Server::Init) {
function NAN_METHOD (line 644) | NAN_METHOD(S7Server::New) {
function NAN_METHOD (line 709) | NAN_METHOD(S7Server::RWBufferCallback) {
function NAN_METHOD (line 887) | NAN_METHOD(S7Server::Start) {
function NAN_METHOD (line 907) | NAN_METHOD(S7Server::StartTo) {
function NAN_METHOD (line 938) | NAN_METHOD(S7Server::Stop) {
function NAN_METHOD (line 958) | NAN_METHOD(S7Server::SetResourceless) {
function NAN_METHOD (line 978) | NAN_METHOD(S7Server::GetParam) {
function NAN_METHOD (line 993) | NAN_METHOD(S7Server::SetParam) {
function NAN_METHOD (line 1007) | NAN_METHOD(S7Server::GetEventsMask) {
function NAN_METHOD (line 1015) | NAN_METHOD(S7Server::SetEventsMask) {
function NAN_METHOD (line 1026) | NAN_METHOD(S7Server::RegisterArea) {
function NAN_METHOD (line 1075) | NAN_METHOD(S7Server::UnregisterArea) {
function NAN_METHOD (line 1104) | NAN_METHOD(S7Server::SetArea) {
function NAN_METHOD (line 1160) | NAN_METHOD(S7Server::GetArea) {
function NAN_METHOD (line 1196) | NAN_METHOD(S7Server::LockArea) {
function NAN_METHOD (line 1220) | NAN_METHOD(S7Server::UnlockArea) {
function NAN_METHOD (line 1244) | NAN_METHOD(S7Server::ServerStatus) {
function NAN_METHOD (line 1257) | NAN_METHOD(S7Server::ClientsCount) {
function NAN_METHOD (line 1264) | NAN_METHOD(S7Server::GetCpuStatus) {
function NAN_METHOD (line 1279) | NAN_METHOD(S7Server::SetCpuStatus) {
function NAN_METHOD (line 1292) | NAN_METHOD(S7Server::ErrorText) {
function NAN_METHOD (line 1301) | NAN_METHOD(S7Server::EventText) {
function NAN_METHOD (line 1351) | NAN_METHOD(S7Server::LastError) {
FILE: src/node_snap7_server.h
function namespace (line 16) | namespace node_snap7 {
FILE: src/snap7.cpp
function longword (line 549) | longword TS7Server::GetEventsMask()
function longword (line 559) | longword TS7Server::GetLogMask()
function TextString (line 748) | TextString CliErrorText(int Error)
function TextString (line 755) | TextString SrvErrorText(int Error)
function TextString (line 762) | TextString ParErrorText(int Error)
function TextString (line 769) | TextString SrvEventText(TSrvEvent *Event)
FILE: src/snap7.h
type byte (line 144) | typedef uint8_t byte;
type word (line 145) | typedef uint16_t word;
type longword (line 146) | typedef uint32_t longword;
type byte (line 147) | typedef byte *pbyte;
type word (line 148) | typedef word *pword;
type S7Object (line 149) | typedef uintptr_t S7Object;
type tm (line 154) | typedef struct
type TS7Tag (line 198) | typedef struct{
type TS7DataItem (line 324) | typedef struct{
type TS7BlocksList (line 338) | typedef struct {
type TS7BlockInfo (line 349) | typedef struct {
type word (line 368) | typedef word TS7BlocksOfType[0x2000];
type TS7BlocksOfType (line 369) | typedef TS7BlocksOfType *PS7BlocksOfType;
type TS7OrderCode (line 372) | typedef struct {
type TS7CpuInfo (line 380) | typedef struct {
type TS7CpInfo (line 389) | typedef struct {
type SZL_HEADER (line 398) | typedef struct {
type TS7SZL (line 403) | typedef struct {
type TS7SZLList (line 409) | typedef struct {
type TS7Protection (line 415) | typedef struct {
type TSrvEvent (line 641) | typedef struct{
function class (line 757) | class TS7Client
type TS7Client (line 858) | typedef TS7Client *PS7Client;
function class (line 862) | class TS7Server
type TS7Server (line 896) | typedef TS7Server *PS7Server;
function class (line 901) | class TS7Partner
type TS7Partner (line 937) | typedef TS7Partner *PS7Partner;
type std (line 948) | typedef std::string TextString;
Condensed preview — 51 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (971K chars).
[
{
"path": ".github/workflows/test-and-release.yml",
"chars": 1269,
"preview": "name: Test and Release\non: [push, pull_request, workflow_dispatch]\npermissions:\n contents: read\njobs:\n build:\n stra"
},
{
"path": ".gitignore",
"chars": 35,
"preview": ".vscode/\nbuild/\nnode_modules/\ntest/"
},
{
"path": ".npmignore",
"chars": 53,
"preview": "test/\n.travis.yml\nappveyor.yml\n.npmignore\n.gitignore\n"
},
{
"path": "LICENSE",
"chars": 1076,
"preview": "(The MIT License)\n\nCopyright (c) 2019 Mathias Küsel\n\nPermission is hereby granted, free of charge, to any person\nobtaini"
},
{
"path": "README.md",
"chars": 3877,
"preview": "# node-snap7\n\n[](https://www.npmjs.com/package/node-s"
},
{
"path": "binding.gyp",
"chars": 2516,
"preview": "{\n \"targets\": [{\n \"target_name\": \"node_snap7\",\n \"include_dirs\": [\n \"<!(node -e \\\"require('na"
},
{
"path": "deps/snap7/HISTORY.txt",
"chars": 9766,
"preview": "======================================================================[2015-06-14]\nVersion 1.4.0 - release for gourmets "
},
{
"path": "deps/snap7/gpl.txt",
"chars": 35147,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "deps/snap7/lgpl-3.0.txt",
"chars": 7651,
"preview": " GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007"
},
{
"path": "deps/snap7/src/core/s7_client.cpp",
"chars": 16266,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_client.h",
"chars": 5059,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_firmware.h",
"chars": 76036,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_isotcp.cpp",
"chars": 16740,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_isotcp.h",
"chars": 12384,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_micro_client.cpp",
"chars": 118461,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_micro_client.h",
"chars": 13577,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_partner.cpp",
"chars": 33307,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_partner.h",
"chars": 10107,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_peer.cpp",
"chars": 4990,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_peer.h",
"chars": 2877,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_server.cpp",
"chars": 78522,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_server.h",
"chars": 9928,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_text.cpp",
"chars": 30521,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_text.h",
"chars": 2756,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/core/s7_types.h",
"chars": 33379,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/lib/snap7.def",
"chars": 2204,
"preview": "LIBRARY SNAP7.DLL\nEXPORTS\n Cli_Create\n Cli_Destroy\n Cli_ConnectTo\n Cli_SetConnectionParams\n Cli_SetConnectionType\n "
},
{
"path": "deps/snap7/src/lib/snap7_libmain.cpp",
"chars": 40130,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/lib/snap7_libmain.h",
"chars": 14379,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_msgsock.cpp",
"chars": 26663,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_msgsock.h",
"chars": 13088,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_platform.h",
"chars": 5184,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_sysutils.cpp",
"chars": 3188,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_sysutils.h",
"chars": 2428,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_tcpsrvr.cpp",
"chars": 15361,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_tcpsrvr.h",
"chars": 9532,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_threads.cpp",
"chars": 5387,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/snap_threads.h",
"chars": 2546,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/sol_threads.h",
"chars": 6603,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/unix_threads.h",
"chars": 7272,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "deps/snap7/src/sys/win_threads.h",
"chars": 4873,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "doc/client.md",
"chars": 36519,
"preview": " ## S7Client\n - [Control functions](#control-functions)\n - [Connect()](#connect)\n - [ConnectTo()](#connect-to)\n - "
},
{
"path": "doc/server.md",
"chars": 11827,
"preview": "## S7Server\n- [Administrative functions](#administrative-functions)\n - [Start()](#start)\n - [StartTo()](#start-to)\n -"
},
{
"path": "lib/node-snap7.js",
"chars": 2165,
"preview": "/*\n * Copyright (c) 2019, Mathias Küsel\n * MIT License <https://github.com/mathiask88/node-snap7/blob/master/LICENSE>\n *"
},
{
"path": "package.json",
"chars": 813,
"preview": "{\n \"name\": \"node-snap7\",\n \"main\": \"./lib/node-snap7.js\",\n \"version\": \"1.0.9\",\n \"description\": \"Native node.js addon/"
},
{
"path": "src/node_snap7.cpp",
"chars": 353,
"preview": "/*\n * Copyright (c) 2019, Mathias Küsel\n * MIT License <https://github.com/mathiask88/node-snap7/blob/master/LICENSE>\n *"
},
{
"path": "src/node_snap7_client.cpp",
"chars": 78466,
"preview": "/*\n * Copyright (c) 2019, Mathias Küsel\n * MIT License <https://github.com/mathiask88/node-snap7/blob/master/LICENSE>\n *"
},
{
"path": "src/node_snap7_client.h",
"chars": 5623,
"preview": "/*\n * Copyright (c) 2019, Mathias Küsel\n * MIT License <https://github.com/mathiask88/node-snap7/blob/master/LICENSE>\n *"
},
{
"path": "src/node_snap7_server.cpp",
"chars": 41024,
"preview": "/*\n * Copyright (c) 2019, Mathias Küsel\n * MIT License <https://github.com/mathiask88/node-snap7/blob/master/LICENSE>\n *"
},
{
"path": "src/node_snap7_server.h",
"chars": 2629,
"preview": "/*\n * Copyright (c) 2019, Mathias Küsel\n * MIT License <https://github.com/mathiask88/node-snap7/blob/master/LICENSE>\n *"
},
{
"path": "src/snap7.cpp",
"chars": 29563,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
},
{
"path": "src/snap7.h",
"chars": 40995,
"preview": "/*=============================================================================|\n| PROJECT SNAP7 "
}
]
About this extraction
This page contains the full source code of the mathiask88/node-snap7 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 51 files (913.2 KB), approximately 276.2k tokens, and a symbol index with 558 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.