From 6f051442a5bc82aa4707e8cb2ce9f603a7e1ff96 Mon Sep 17 00:00:00 2001 From: esmithExperimentControls Date: Tue, 16 Apr 2024 15:22:53 +0100 Subject: [PATCH] Import modbus version R3-3 --- .github/workflows/publish-docs.yml | 60 + .gitignore | 4 +- .gitmodules | 3 + .travis.yml | 117 + LICENSE | 47 + README.md | 5 +- RELEASE.md | 453 + configure/CONFIG_SITE | 1 + configure/RELEASE | 10 +- docs/Makefile | 22 + docs/requirements.txt | 5 + .../source}/K1_C20n_In_Word.png | Bin .../source}/K1_C20n_Out_Bit.png | Bin .../source}/K1_Cn_In_Bit_Array.png | Bin .../source}/K1_Cn_In_Word_Array.png | Bin {documentation => docs/source}/K1_Xn_Bit.png | Bin .../source}/K1_Xn_Bit_Statistics.png | Bin .../source}/K1_Yn_In_Word.png | Bin .../source}/K1_Yn_Out_Bit_Asyn.png | Bin .../source}/K1_Yn_Out_Bit_AsynRegister.png | Bin .../source}/K1_Yn_Out_Word.png | Bin {documentation => docs/source}/K2_ADCs.png | Bin {documentation => docs/source}/Koyo1.png | Bin {documentation => docs/source}/Koyo2.png | Bin .../Modbus_Application_Protocol_V1_1b.pdf | Bin ...s_Messaging_Implementation_Guide_V1_0b.pdf | Bin .../source}/Modbus_over_serial_line_V1_02.pdf | Bin docs/source/_extra/.keepdir | 0 docs/source/_static/css/my_theme.css | 19 + docs/source/_static/theme_overrides.css | 13 + docs/source/acknowledgments.rst | 10 + docs/source/conf.py | 39 + docs/source/creating_driver.rst | 457 + docs/source/debugging.rst | 137 + docs/source/device_support.rst | 648 + docs/source/driver_architecture.rst | 177 + docs/source/example_applications.rst | 210 + docs/source/index.rst | 21 + docs/source/medm_screens.rst | 91 + docs/source/overview.rst | 248 + docs/source/testDataTypes.png | Bin 0 -> 91199 bytes docs/source/testDataTypesSimulator.png | Bin 0 -> 74748 bytes documentation/modbus.html | 582 - documentation/modbusDoc.html | 2657 ---- documentation/modbusReleaseNotes.html | 395 - iocBoot/iocTest/Koyo1.cmd | 8 +- iocBoot/iocTest/Koyo2.cmd | 6 +- iocBoot/iocTest/Koyo_Sim1.cmd | 113 + iocBoot/iocTest/ModbusF1_A0_128bits.mbs | Bin 0 -> 157748 bytes iocBoot/iocTest/ModbusF3_A100_80words.mbs | Bin 0 -> 150102 bytes iocBoot/iocTest/ModbusF3_A200_80words.mbs | Bin 0 -> 150102 bytes iocBoot/iocTest/ModbusF3_A300_80words.mbs | Bin 0 -> 150102 bytes iocBoot/iocTest/array_test.cmd | 6 +- iocBoot/iocTest/sim1.substitutions | 151 - iocBoot/iocTest/sim2.cmd | 6 +- iocBoot/iocTest/sim3.cmd | 6 +- iocBoot/iocTest/sim4.cmd | 6 +- iocBoot/iocTest/sim5.cmd | 6 +- iocBoot/iocTest/sim6.cmd | 6 +- .../{sim1.cmd => testAbsoluteAddress.cmd} | 45 +- .../iocTest/testAbsoluteAddress.substitutions | 156 + iocBoot/iocTest/testDataTypes.cmd | 116 + iocBoot/iocTest/testDataTypes.py | 35 + iocBoot/iocTest/testDataTypes.substitutions | 331 + modbusApp/Db/Makefile | 27 +- modbusApp/Db/aiFloat64.template | 8 +- modbusApp/Db/ai_average.template | 10 +- modbusApp/Db/aoFloat64.template | 6 +- modbusApp/Db/int64in.template | 6 + modbusApp/Db/int64out.template | 5 + modbusApp/Db/longoutInt32.template | 1 + modbusApp/Makefile | 1 + modbusApp/op/Makefile | 12 + modbusApp/op/adl/modbusDataTypes.adl | 3743 ++++- modbusApp/op/adl/modbusDataTypesTest.adl | 11 +- modbusApp/op/bob/autoconvert/Koyo1.bob | 244 + modbusApp/op/bob/autoconvert/Koyo2.bob | 165 + modbusApp/op/bob/autoconvert/Koyo_4ADC.bob | 499 + modbusApp/op/bob/autoconvert/Koyo_8inputs.bob | 1276 ++ .../op/bob/autoconvert/Koyo_8outputs.bob | 1116 ++ modbusApp/op/bob/autoconvert/array_test.bob | 89 + modbusApp/op/bob/autoconvert/modbusArray.bob | 179 + .../op/bob/autoconvert/modbusArrayTest.bob | 270 + .../op/bob/autoconvert/modbusDataTypes.bob | 4859 ++++++ .../bob/autoconvert/modbusDataTypesTest.bob | 130 + .../op/bob/autoconvert/modbusStatistics.bob | 358 + .../op/bob/autoconvert/modbusStringTest.bob | 639 + .../bob/autoconvert/modbusStringTestTop.bob | 53 + .../op/bob/autoconvert/modbusTestSyncIO.bob | 250 + modbusApp/op/edl/autoconvert/Koyo1.edl | 224 + modbusApp/op/edl/autoconvert/Koyo2.edl | 200 + modbusApp/op/edl/autoconvert/Koyo_4ADC.edl | 784 + modbusApp/op/edl/autoconvert/Koyo_8inputs.edl | 1860 +++ .../op/edl/autoconvert/Koyo_8outputs.edl | 1565 ++ modbusApp/op/edl/autoconvert/array_test.edl | 111 + modbusApp/op/edl/autoconvert/modbusArray.edl | 242 + .../op/edl/autoconvert/modbusArrayTest.edl | 339 + .../op/edl/autoconvert/modbusDataTypes.edl | 6034 ++++++++ .../edl/autoconvert/modbusDataTypesTest.edl | 132 + .../op/edl/autoconvert/modbusStatistics.edl | 525 + .../op/edl/autoconvert/modbusStringTest.edl | 1018 ++ .../edl/autoconvert/modbusStringTestTop.edl | 79 + .../op/edl/autoconvert/modbusTestSyncIO.edl | 337 + modbusApp/op/opi/{ => autoconvert}/Koyo1.opi | 867 +- modbusApp/op/opi/{ => autoconvert}/Koyo2.opi | 699 +- .../op/opi/{ => autoconvert}/Koyo_4ADC.opi | 2885 ++-- .../op/opi/{ => autoconvert}/Koyo_8inputs.opi | 7273 +++++---- .../opi/{ => autoconvert}/Koyo_8outputs.opi | 6451 ++++---- modbusApp/op/opi/autoconvert/array_test.opi | 198 + .../op/opi/{ => autoconvert}/modbusArray.opi | 1817 ++- .../modbusArrayTest.opi} | 2451 ++- .../op/opi/autoconvert/modbusDataTypes.opi | 12516 ++++++++++++++++ .../{ => autoconvert}/modbusDataTypesTest.opi | 483 +- .../op/opi/autoconvert/modbusStatistics.opi | 1452 ++ .../op/opi/autoconvert/modbusStringTest.opi | 2024 +++ .../opi/autoconvert/modbusStringTestTop.opi | 132 + .../op/opi/autoconvert/modbusTestSyncIO.opi | 690 + modbusApp/op/opi/modbusDataTypes.opi | 4996 ------ modbusApp/op/ui/{ => autoconvert}/Koyo1.ui | 89 +- modbusApp/op/ui/{ => autoconvert}/Koyo2.ui | 89 +- .../op/ui/{ => autoconvert}/Koyo_4ADC.ui | 93 +- .../op/ui/{ => autoconvert}/Koyo_8inputs.ui | 97 +- .../op/ui/{ => autoconvert}/Koyo_8outputs.ui | 95 +- modbusApp/op/ui/autoconvert/array_test.ui | 228 + .../op/ui/{ => autoconvert}/modbusArray.ui | 93 +- .../op/ui/autoconvert/modbusArrayTest.ui | 647 + .../op/ui/autoconvert/modbusDataTypes.ui | 12194 +++++++++++++++ .../{ => autoconvert}/modbusDataTypesTest.ui | 97 +- .../ui/{ => autoconvert}/modbusStatistics.ui | 91 +- .../op/ui/autoconvert/modbusStringTest.ui | 1780 +++ .../op/ui/autoconvert/modbusStringTestTop.ui | 191 + .../ui/{ => autoconvert}/modbusTestSyncIO.ui | 101 +- modbusApp/op/ui/modbusDataTypes.ui | 4853 ------ modbusApp/src/Makefile | 26 +- modbusApp/src/drvModbusAsyn.c | 2609 ---- modbusApp/src/drvModbusAsyn.cpp | 2940 ++++ modbusApp/src/drvModbusAsyn.h | 275 +- modbusApp/src/modbusInclude.dbd | 7 - modbusApp/src/modbusInterpose.c | 33 +- modbusApp/src/modbusInterpose.h | 1 - modbusApp/src/testClient.cpp | 75 + modbusApp/src/testModbusSyncIO.cpp | 5 - 142 files changed, 77810 insertions(+), 28668 deletions(-) create mode 100644 .github/workflows/publish-docs.yml create mode 100644 .gitmodules create mode 100644 .travis.yml create mode 100644 LICENSE create mode 100644 RELEASE.md create mode 100644 docs/Makefile create mode 100644 docs/requirements.txt rename {documentation => docs/source}/K1_C20n_In_Word.png (100%) rename {documentation => docs/source}/K1_C20n_Out_Bit.png (100%) rename {documentation => docs/source}/K1_Cn_In_Bit_Array.png (100%) rename {documentation => docs/source}/K1_Cn_In_Word_Array.png (100%) rename {documentation => docs/source}/K1_Xn_Bit.png (100%) rename {documentation => docs/source}/K1_Xn_Bit_Statistics.png (100%) rename {documentation => docs/source}/K1_Yn_In_Word.png (100%) rename {documentation => docs/source}/K1_Yn_Out_Bit_Asyn.png (100%) rename {documentation => docs/source}/K1_Yn_Out_Bit_AsynRegister.png (100%) rename {documentation => docs/source}/K1_Yn_Out_Word.png (100%) rename {documentation => docs/source}/K2_ADCs.png (100%) rename {documentation => docs/source}/Koyo1.png (100%) rename {documentation => docs/source}/Koyo2.png (100%) rename {documentation => docs/source}/Modbus_Application_Protocol_V1_1b.pdf (100%) rename {documentation => docs/source}/Modbus_Messaging_Implementation_Guide_V1_0b.pdf (100%) rename {documentation => docs/source}/Modbus_over_serial_line_V1_02.pdf (100%) create mode 100644 docs/source/_extra/.keepdir create mode 100644 docs/source/_static/css/my_theme.css create mode 100644 docs/source/_static/theme_overrides.css create mode 100644 docs/source/acknowledgments.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/creating_driver.rst create mode 100644 docs/source/debugging.rst create mode 100644 docs/source/device_support.rst create mode 100644 docs/source/driver_architecture.rst create mode 100644 docs/source/example_applications.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/medm_screens.rst create mode 100644 docs/source/overview.rst create mode 100644 docs/source/testDataTypes.png create mode 100644 docs/source/testDataTypesSimulator.png delete mode 100644 documentation/modbus.html delete mode 100644 documentation/modbusDoc.html delete mode 100644 documentation/modbusReleaseNotes.html create mode 100644 iocBoot/iocTest/Koyo_Sim1.cmd create mode 100644 iocBoot/iocTest/ModbusF1_A0_128bits.mbs create mode 100644 iocBoot/iocTest/ModbusF3_A100_80words.mbs create mode 100644 iocBoot/iocTest/ModbusF3_A200_80words.mbs create mode 100644 iocBoot/iocTest/ModbusF3_A300_80words.mbs delete mode 100644 iocBoot/iocTest/sim1.substitutions rename iocBoot/iocTest/{sim1.cmd => testAbsoluteAddress.cmd} (68%) create mode 100644 iocBoot/iocTest/testAbsoluteAddress.substitutions create mode 100644 iocBoot/iocTest/testDataTypes.cmd create mode 100644 iocBoot/iocTest/testDataTypes.py create mode 100644 iocBoot/iocTest/testDataTypes.substitutions create mode 100644 modbusApp/Db/int64in.template create mode 100644 modbusApp/Db/int64out.template create mode 100644 modbusApp/op/Makefile create mode 100644 modbusApp/op/bob/autoconvert/Koyo1.bob create mode 100644 modbusApp/op/bob/autoconvert/Koyo2.bob create mode 100644 modbusApp/op/bob/autoconvert/Koyo_4ADC.bob create mode 100644 modbusApp/op/bob/autoconvert/Koyo_8inputs.bob create mode 100644 modbusApp/op/bob/autoconvert/Koyo_8outputs.bob create mode 100644 modbusApp/op/bob/autoconvert/array_test.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusArray.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusArrayTest.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusDataTypes.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusDataTypesTest.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusStatistics.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusStringTest.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusStringTestTop.bob create mode 100644 modbusApp/op/bob/autoconvert/modbusTestSyncIO.bob create mode 100644 modbusApp/op/edl/autoconvert/Koyo1.edl create mode 100644 modbusApp/op/edl/autoconvert/Koyo2.edl create mode 100644 modbusApp/op/edl/autoconvert/Koyo_4ADC.edl create mode 100644 modbusApp/op/edl/autoconvert/Koyo_8inputs.edl create mode 100644 modbusApp/op/edl/autoconvert/Koyo_8outputs.edl create mode 100644 modbusApp/op/edl/autoconvert/array_test.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusArray.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusArrayTest.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusDataTypes.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusDataTypesTest.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusStatistics.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusStringTest.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusStringTestTop.edl create mode 100644 modbusApp/op/edl/autoconvert/modbusTestSyncIO.edl rename modbusApp/op/opi/{ => autoconvert}/Koyo1.opi (84%) rename modbusApp/op/opi/{ => autoconvert}/Koyo2.opi (82%) rename modbusApp/op/opi/{ => autoconvert}/Koyo_4ADC.opi (81%) rename modbusApp/op/opi/{ => autoconvert}/Koyo_8inputs.opi (81%) rename modbusApp/op/opi/{ => autoconvert}/Koyo_8outputs.opi (80%) create mode 100644 modbusApp/op/opi/autoconvert/array_test.opi rename modbusApp/op/opi/{ => autoconvert}/modbusArray.opi (89%) rename modbusApp/op/opi/{modbusStatistics.opi => autoconvert/modbusArrayTest.opi} (69%) create mode 100644 modbusApp/op/opi/autoconvert/modbusDataTypes.opi rename modbusApp/op/opi/{ => autoconvert}/modbusDataTypesTest.opi (80%) create mode 100644 modbusApp/op/opi/autoconvert/modbusStatistics.opi create mode 100644 modbusApp/op/opi/autoconvert/modbusStringTest.opi create mode 100644 modbusApp/op/opi/autoconvert/modbusStringTestTop.opi create mode 100644 modbusApp/op/opi/autoconvert/modbusTestSyncIO.opi delete mode 100644 modbusApp/op/opi/modbusDataTypes.opi rename modbusApp/op/ui/{ => autoconvert}/Koyo1.ui (80%) rename modbusApp/op/ui/{ => autoconvert}/Koyo2.ui (79%) rename modbusApp/op/ui/{ => autoconvert}/Koyo_4ADC.ui (95%) rename modbusApp/op/ui/{ => autoconvert}/Koyo_8inputs.ui (98%) rename modbusApp/op/ui/{ => autoconvert}/Koyo_8outputs.ui (98%) create mode 100644 modbusApp/op/ui/autoconvert/array_test.ui rename modbusApp/op/ui/{ => autoconvert}/modbusArray.ui (85%) create mode 100644 modbusApp/op/ui/autoconvert/modbusArrayTest.ui create mode 100644 modbusApp/op/ui/autoconvert/modbusDataTypes.ui rename modbusApp/op/ui/{ => autoconvert}/modbusDataTypesTest.ui (66%) rename modbusApp/op/ui/{ => autoconvert}/modbusStatistics.ui (93%) create mode 100644 modbusApp/op/ui/autoconvert/modbusStringTest.ui create mode 100644 modbusApp/op/ui/autoconvert/modbusStringTestTop.ui rename modbusApp/op/ui/{ => autoconvert}/modbusTestSyncIO.ui (89%) delete mode 100644 modbusApp/op/ui/modbusDataTypes.ui delete mode 100644 modbusApp/src/drvModbusAsyn.c create mode 100644 modbusApp/src/drvModbusAsyn.cpp delete mode 100644 modbusApp/src/modbusInclude.dbd create mode 100644 modbusApp/src/testClient.cpp diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml new file mode 100644 index 0000000..47d99b3 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,60 @@ +name: Publish Sphinx Docs to GitHub Pages +on: + # Build the docs on pushes to main branch, PRs to main branch, and new tags. + # Publish only on demand. + push: + branches: + - master + tags: + - '*' # all tags + workflow_dispatch: # allow manual triggering + inputs: + deploy: + description: 'Deploy documentation' + type: boolean + required: true + default: false + + +# see: https://sphinx-notes.github.io/pages/ +# see: https://github.com/marketplace/actions/sphinx-to-github-pages + +jobs: + + build-docs: + runs-on: ubuntu-latest + + steps: + - name: Deploy Information + if: ${{ github.event.inputs.deploy }} + run: | + echo "The will be published from this workflow run." + + - name: Checkout + uses: actions/checkout@master + with: + fetch-depth: 0 # otherwise, you will fail to push refs to dest repo + + - name: Install pip + run: | + sudo apt-get -y update + sudo apt-get -y install python3-pip + which pip3 + which pip + + - name: Install packages used by Sphinx + run: | + pip install m2r2 "pygments >=2.7.0" "sphinx_rtd_theme >=1.2.0" sphinx-multibuild + pip list + + - name: Build and Commit + uses: sphinx-notes/pages@v2 + with: + # path to conf.py directory + documentation_path: docs/source + + - name: Push changes + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: gh-pages diff --git a/.gitignore b/.gitignore index a075596..8aea051 100644 --- a/.gitignore +++ b/.gitignore @@ -3,12 +3,14 @@ O.* *.swp *BAK.adl bin/ -db/ +/db/ dbd/ html/ +_docs/ include/ lib/ templates/ +__pycache__/ cdCommands envPaths dllPath.bat diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..cfa3a70 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule ".ci"] + path = .ci + url = https://github.com/epics-base/ci-scripts diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..dd90f89 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,117 @@ +# .travis.yml for use with EPICS Base ci-scripts +# (see: https://github.com/epics-base/ci-scripts) + +language: cpp +compiler: gcc +dist: xenial + +cache: + directories: + - $HOME/.cache + +env: + global: + - SETUP_PATH=.ci + - MODULES="asyn" + - ASYN=master + +addons: + apt: + packages: + # for all EPICS builds + - libreadline6-dev + - libncurses5-dev + - perl + # for clang compiler + - clang + # for mingw builds (32bit and 64bit) + - g++-mingw-w64-i686 + - g++-mingw-w64-x86-64 + # for RTEMS cross builds + - qemu-system-x86 + homebrew: + packages: + # for all EPICS builds + - bash + # for the sequencer + - re2c + update: true + +install: + - ./.ci/travis/prepare.sh + +script: + - ./.ci/travis/build.sh + +# If you need to do more during install and build, +# add a local directory to your module and do e.g. +# - ./.ci-local/travis/install-extras.sh + +# Define build jobs + +# Well-known variables to use +# SET source setup file +# ADD_MODULES extra modules (for a specific job) +# EXTRA content will be added to make command line +# STATIC set to YES for static build (default: NO) +# TEST set to NO to skip running the tests (default: YES) +# VV set to make build scripts verbose (default: unset) + +# Usually from setup files, but may be specified or overridden +# on a job line +# MODULES list of dependency modules +# BASE branch or release tag name of the EPICS Base to use +# branch or release tag for a specific module +# ... see README for setup file syntax description + +jobs: + include: + +# Different configurations of default gcc and clang + - env: BASE=7.0 + + - env: BASE=7.0 + compiler: clang + + - env: BASE=7.0 EXTRA="CMD_CXXFLAGS=-std=c++11" + + - env: BASE=7.0 EXTRA="CMD_CXXFLAGS=-std=c++11" + compiler: clang + +# Trusty: compiler versions very close to RHEL 7 + + - env: BASE=7.0 + dist: trusty + + - env: BASE=7.0 EXTRA="CMD_CXXFLAGS=-std=c++11" + dist: trusty + +# Cross-compilations to Windows using MinGW and WINE + + - env: BASE=7.0 WINE=32 TEST=NO STATIC=YES + compiler: mingw + + - env: BASE=7.0 WINE=64 TEST=NO STATIC=NO + compiler: mingw + +# Cross-compilation to RTEMS + + - env: BASE=7.0 RTEMS=4.10 TEST=NO + + - env: BASE=7.0 RTEMS=4.9 TEST=NO + +# Other gcc versions (added as an extra package) + + - env: BASE=7.0 + compiler: gcc-6 + addons: { apt: { packages: ["g++-6"], sources: ["ubuntu-toolchain-r-test"] } } + + - env: BASE=7.0 + compiler: gcc-7 + addons: { apt: { packages: ["g++-7"], sources: ["ubuntu-toolchain-r-test"] } } + +# MacOS build + + - env: BASE=7.0 + os: osx + compiler: clang diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6527153 --- /dev/null +++ b/LICENSE @@ -0,0 +1,47 @@ +Copyright and License Terms +--------------------------- + +Copyright (c) 2007-2018 Mark L. Rivers +Copyright (c) 2007-2018 The University of Chicago + +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. + +________________________________________________________________________ + +Additional Disclaimers +---------------------- + +This software is copyright in part by these institutions: + +* The University of Chicago + +In no event shall these institutions be liable to any party for direct, +indirect, special, incidental, or consequential damages arising out of +the use of this software, its documentation, or any derivatives thereof, +even if advised of the possibility of such damage. + +These institutions specifically disclaim any warranties, including, but +not limited to, the implied warranties of merchantability, fitness for a +particular purpose, and non-infringement. This software is provided on +an "as is" basis, and these institutions have no obligation to provide +maintenance, support, updates, enhancements, or modifications. + diff --git a/README.md b/README.md index 4c8604a..a2ace02 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,5 @@ and the EPICS asyn TCP/IP or serial port driver. Additional information: -* [Home page](http://cars.uchicago.edu/software/epics/modbus.html) -* [Documentation](http://cars.uchicago.edu/software/epics/modbusDoc.html) -* [Release notes](http://cars.uchicago.edu/software/epics/modbusReleaseNotes.html) +* [Documentation](https://epics-modules.github.io/modbus) +* [Release notes](RELEASE.md) diff --git a/RELEASE.md b/RELEASE.md new file mode 100644 index 0000000..16dd3e0 --- /dev/null +++ b/RELEASE.md @@ -0,0 +1,453 @@ +# modbus: Modbus Support - Release Notes + +## R3-3 (December 7, 2023) +- Moved the documentation from https://epics-modbus.readthedocs.io/en/latest/ + to Github pages, https://epics-modules.github.io/modbus. +- Renamed the application dbd file from modbus.dbd to modbusApp.dbd to reduce confusion. +- Fix Modbus exception reporting when the asynInterposeEos interface is being used. +- Initialize ioStatus_ to asynError so that readInt32, readFloat64, etc. will + return an error if the first poll of the device is not complete. + This correctly sets STAT and SEVR in records with PINI=YES and long poll intervals on the driver. + +## R3-2 (November 21, 2020) +- Changed the dataType argument to drvModusAsynConfigure(). + Previously this was the `int` value corresponding to one of the `modbusDataType_t` enums + defined `drvModbusAsyn.h`. This is not very convenient, so the dataType argument was changed + to a string. It can now either be the enum value (for backwards compatibility) or one of the + strings like `INT32_LE`. The string comparison is case-insensitive. + Use of the strings is strongly encouraged, since it will help avoid issues with + backwards compatibility of enum values as happened in R3-1. + NOTE: When using the iocsh shell this change is backwards compatible, because an unquoted + integer can be read as a string. However, with the vxWorks shell it is not backwards + compatible, because string arguments must be quoted, so startup scripts will need to add quotes + around the dataType argument. +- Improved the drvModbusAsyn::report() function to print the default dataType for the driver. + The dataType is printed both as the integer enum value and as the corresponding string. +- Changed the documentation and all example IOCs to set noProcessEos=0 in drvAsynIPPortConfigure() + commands, so that the asynInterposeEos interface is used. Previously it was 1 in most cases. + The asynInterposeEos interface handles end-of-string (EOS) processing, which is not needed for Modbus TCP. + However, it also handles issuing repeated read requests until the requested number of bytes + has been received, which the low-level asyn IP port driver does not do. + Normally Modbus TCP sends responses in a single packet, so this may not be needed, but using + the asynInterpose interface does no harm. + However, the asynInterposeEos interface is definitely needed when using drvAsynIPPortConfigure to talk + to a terminal server that is communicating with the Modbus device over Modbus RTU or ASCII, + because then the communication from the device may well be broken up into multiple packets. + +## R3-1 (July 28, 2020) +- Added support for the asynInt64 interface between device support and the driver. +- Added support for 22 new data types including unsigned integers, + 64-bit integers, byte-swapped versions of all 32-bit and 64-bit data types, + and zero-terminated strings. + - INT32_LE_BS Byte-swapped Int32 little-endian + - INT32_BE_BS Byte-swapped Int32 big-endian + - UINT32_LE Unsigned Int32 little-endian + - UINT32_BE Unsigned Int32 big-endian + - UINT32_LE_BS Byte-swapped unsigned Int32 little-endian + - UINT32_BE_BS Byte-swapped unsigned Int32 big-endian + - INT64_LE Int64 little-endian + - INT64_BE Int64 big-endian + - INT64_LE_BS Byte-swapped Int64 little-endian + - INT64_BE_BS Byte-swapped Int64 big-endian + - UINT64_LE Unsigned Int64 little-endian + - UINT64_BE Unsigned Int64 big-endian + - UINT64_LE_BS Byte-swapped unsigned Int64 little-endian + - UINT64_BE_BS Byte-swapped unsigned Int64 big-endian + - FLOAT32_LE_BS Byte-swapped Float32 little-endian + - FLOAT32_BE_BS Byte-swapped Float32 big-endian + - FLOAT64_LE_BS Byte-swapped Float64 little-endian + - FLOAT64_BE_BS Byte-swapped Float64 big-endian + - ZSTRING_HIGH Zero terminated string data. One character is stored in the high byte of each register. + - ZSTRING_LOW Zero terminated string data. One character is stored in the low byte of each register. + - ZSTRING_HIGH_LOW Zero terminated string data. Two characters are stored in each register, + the first in the high byte and the second in the low byte. + - ZSTRING_LOW_HIGH Zero terminated string data. Two characters are stored in each register, + the first in the low byte and the second in the high byte. + + **Note:** The enum values for the datatypes are not backwards compatible. + INT16 and UINT16 were swapped and everything beyond INT32_LE is different. + This may require changes to startup scripts. + + **Note:** For big-endian formats the _BE format is order in which an IEEE value would + be stored on a big-endian machine, and _BE_BS swaps the bytes in each 16-bit word + relative to IEEE specification. + However, for little-endian formats the _LE format is byte-swapped within each 16-bit word + compared how the IEEE value would be be stored on a little-endian machine. + The _LE_BS format is the order in which an IEEE value would be stored on a little-endian machine. + This is done for backwards compatibility, because that is how _LE has always been stored in + previous versions of this modbus module. +- Converted the documentation from HTML to REst, and moved to + https://epics-modbus.readthedocs.io/en/latest/. +- Converted the release notes from HTML to Github Markdown and moved to + https://github.com/epics-modules/modbus/blob/master/RELEASE.md. +- Improved debugging by returning the actual number of bytes transfered in read operations in + the interpose interface functions. +- Fixed writing strings with absolute addressing. +- Fixed the length limit of function codes 1,2,5 and 15. + It was previously allowing 2015 and 1983 bits, rather than 2000 and 1968. +- Added support for specifying the maximum length of strings in the drvUser field. + STRING_HIGH=17 would result in a 16 character long string (plus terminating 0 byte) +- Handle errors in drvModbusAsynConfigure. + +Thanks to Krisztian Loki from ESS for the ZSTRING support and the last 4 fixes above. + +## R3-0 (August 9, 2019) +- This is a major rewrite of the driver, changing from C to C++ + inheriting from asynPortDriver. The major reason for the change is + to be able to invoke the class methods such as + drvModbusAsyn::doModbusIO() from other drivers. This allows drivers + that communicate with Modbus devices to call methods to perform the + Modbus I/O directly, which was not possible with the previous C API. +- The new driver should be completely backwards compatible with + previous versions, so no changes to IOC startup scripts or OPI + displays are required. +- A new example program, testClient.cpp, has been added. This program + demonstrates how to instantiate a drvModbusAsyn object and use it to + perform Modbus I/O to an external device. This example is a pure C++ + application running without an IOC. The same code could be used in a + driver in an IOC. +- Added OPI autoconvert files for edm, CSS BOY, and caQtDM. + +## R2-11 (June 28, 2018) +- Fixed problem with asynPrintIO. It was printing too few bytes under + some conditions. +- Added a counter of the number of I/O errors since the last + successful I/O to the device. This counter is printed when the I/O + returns to normal, and the counter is reset. Thanks to Scott Stubbs + and Bruce Hill for this. + +## R2-10-1 (September 15, 2017) +- Previously the Modbus/TCP transaction ID was set to 1 on writes and + ignored on reads. Now the Modbus transaction ID is incremented by 1 + on each message sent by the driver. On the reply the driver waits + until a message with the correct transaction ID is received, + ignoring messages with any other transaction ID. This is more + robust, especially for Modbus/UDP links. Thanks to Eric Norum for + this. + +## R2-10 (September 15, 2017) +- Added an epicsAtExit handler which stops the poller task. This + eliminates error messages from the poller task when the IOC exits. +- Greatly reduced the number of error messages printed when there are + communication errors or timeouts with the Modbus device. Previously + error messages were printed for each asyn port on each poller loop. + Now, there is a single message per port when an error condition is + detected, and a single message when the error condition ends. For + example this is the output from a Koyo PLC with 3 drvModbusAsyn + input ports that are polling at 10 Hz. The drvAsynIPPort has the + asynOption `disconnectOnReadTimeout` set to `Y` set so that it + reconnects quickly when the network is reconnected. The Ethernet + cable was unplugged for about 8 seconds and then plugged back in. + + 2017/09/12 13:14:25.764 drvModbusAsyn::doModbusIO port K1_Xn_Bit error calling writeRead, error=164.54.160.197:502 read error: S_errno_EWOULDBLOCK, nwrite=6/6, nread=0 + 2017/09/12 13:14:25.781 drvModbusAsyn::doModbusIO port K1_Yn_In_Bit error calling writeRead, error=asynManager::queueLockPort queueRequest timed out, nwrite=0/6, nread=0 + 2017/09/12 13:14:25.814 drvModbusAsyn::doModbusIO port K1_Cn_In_Bit error calling writeRead, error=asynManager::queueLockPort queueRequest timed out, nwrite=0/6, nread=0 + 2017/09/12 13:14:33.564 drvModbusAsyn::doModbusIO port K1_Xn_Bit writeRead status back to normal nwrite=6/6, nread=6 + 2017/09/12 13:14:33.581 drvModbusAsyn::doModbusIO port K1_Yn_In_Bit writeRead status back to normal nwrite=6/6, nread=6 + 2017/09/12 13:14:33.614 drvModbusAsyn::doModbusIO port K1_Cn_In_Bit writeRead status back to normal nwrite=6/6, nread=34 + + The first error message indicates that the K1\_Xn\_Bit driver got a + timeout when reading the device. That timeout causes drvAsynIPPort + driver to disconnect the port because of the asynOption described + above. The next 2 errors are from the other two ports which get + queueRequest timeouts because the port is now disconnected. When the + network cable is reconnected each of the ports prints a `status + back to normal` message. + +- The example IOC startup scripts now call + asynSetOption(`disconnectOnReadTimeout`, `Y`). for TCP ports. + This ensures much faster reconnection when the Modbus device comes + back online if it disconnects. Note that for this to work asyn R4-32 + or later is needed, because of a needed fix to + asynManager::queueLockPort(), which is used by the asynXXXSyncIO + functions. + +## R2-9 (August 23, 2016) +- Added support for specifying absolute Modbus addresses in the asyn + `addr` field. Previously each driver was limited to addressing at + most 125 registers (read operations) or 123 registers (write + operations), and the asyn `addr` field specified an offset + relative to the modbusStartAddress passed as the fifth argument to + drvAsynModbusConfigure(). Now if the modbusStartAddress=-1 then the + driver will use absolute addressing, and the asyn `addr` specifies + the absolute Modbus address in the range 0 to 65535. In this case + the modbusLength argument to drvAsynModbusConfigure() is the maximum + length required for any single Modbus transaction by that driver. + This would be 1 if all Modbus reads and writes are for 16-bit + registers, but it would be 4 if 64-bit floats (4 16-bit registers) + are being used, and 100 (for example) if an Int32 waveform record + with NELM=100 and a 16-bit Modbus data type is being read or + written. +- Added support for strings using the asynOctet interface. Some + vendors use Modbus for string data. The Modbus standard does not + specify how strings should be stored, and different vendors do it + differently. The driver supports 4 new Modbus data types, using the + following drvInfo strings: + - STRING\_HIGH One character is stored in the high byte of each + register. + - STRING\_LOW One character is stored in the low byte of each + register. + - STRING\_HIGH\_LOW Two characters are stored in each register, + the first in the high byte and the second in the low byte. + - STRING\_LOW\_HIGH Two characters are stored in each register, + the first in the low byte and the second in the high byte. + + The standard asynOctet device support is used. This supports + stringout, stringin, and waveform records. Waveform records can be + used for either input or output. The stringin and stringout records + are limited to 40 characters strings, while waveform records are + limited only by the 125/123 register limit of Modbus for read/write + operatations i.e. up to 250 characters. +- Added error checking to make sure the length of the reply from the + Modbus server is the expected value. Previously garbled + communications could cause a crash because of array bounds + violation. + +## R2-8 (February 11, 2016) +- Improved the logic in the poller thread. + - Previously there was a call to epicsThreadSleep at the end of + the poller loop. This meant that the poller always ran at least + once, which might not be desirable. It also meant that one could + only temporarily disable the poller by calling + `pasynManager-\>lockPort()`, or to make it run infrequently by + setting POLL\_DELAY to a long sleep time. In R2-5 the + MODBUS\_READ command was added. However, this just did a read + operation without triggering the poller thread, so records with + I/O Intr scan would not process. It also required disabling the + poller thread with `pasynManager-\>LockPort`. + - The poller thread has been changed so that it calls + epicsEventWait or epicsEventWaitWithTimeout at the beginning of + the poller loop. If the POLL\_DELAY is \>0 then it calls + epicsEventWaitWithTimeout, using the POLL\_DELAY as the timeout. + If POLL\_DELAY is ≤0 then it calls epicsEventWait, with no + timeout. This allows the poller to be suspended indefinitely and + only run when the epicsEvent is signaled. It also means if + POLL\_DELAY ≤0 then the poller does not run at all until the + epicsEvent is signaled. The MODBUS\_READ command now signals the + epicsEvent to trigger the poller, rather than directly doing a + read operation. + - Added a new template file, poll\_trigger.template which loads a + record with the MODBUS\_READ drvInfo string to trigger the + poller. +- Fixed problems when using waveform records with the asynInt32Array + interface. + - If the Modbus data type was not UINT16 or INT16 then the data + were not read into the waveform record correctly. This bug has + been fixed, and new files iocBoot/iocTest/array\_test.cmd and + array\_test.substitions were added to test it using the Modbus + Slave Simulator. New adl files, modbusTestArray.adl and + array\_test.adl were added for these tests. modbusTestArray.adl + also contains controls for POLL\_DELAY and POLL\_TRIGGER to + verify the improvements to the poller thread above. + - Previously the first element in the waveform record was always + the first register in that modbus driver, i.e. it did not allow + specifying a register offset using the asyn ADDR address. This + was improved so now one can specify an offset using the OFFSET + macro parameter, as with the non-array records in modbus. + + +## R2-7-1 (May 6, 2015) +- Minor changes to allow building dynamically on Cygwin. + + +## R2-7 (August 19, 2014) +- Added support for function code 23, Read/Write Multiple Registers. + Because of the architecture of the EPICS Modbus support, a driver + that uses function 23 is restricted to being either a read-only + driver where no data is written, or a write-only driver where no + data is read. It is preferable to use functions codes 3, 4, 6, or 16 + if they are supported. However, some older devices only support + function code 23. + + +## R2-6 (April 10, 2014) +- Fixed a problem with function code 6 (write single register) on Wago + devices when the MASK was not 0x0 or 0xFFFF. In this case a + read/modify/write operation is required, and the driver was reading + from the wrong address. On Wago devices the readback address for a + register is offset by 0x200 from the write address. This offset was + not being applied. +- Added 2 new records to statistics.template. \$(P)\$(R)HistTimeAxis + is a waveform record that contains the X time axis for histogram + plots, and MsPerBin is the time per histogram bin in msec. + + +## R2-5 (October 2, 2013) +- Fixed a mutex issue with the input poller. Previous versions had a + potential problem with input records which did not use Scan=I/O + Intr. In this case there was no mutex protecting access to the read + buffer between the device support thread and the poller thread that + was reading the Modbus data. It is likely that this problem was + rarely if ever encountered because input records were almost always + I/O Intr scanned. The fix was to remove the existing mutex in the + driver and to simply call `pasynManager-\>lockPort()` for the entire + duration of the polling cycle. This fix has a positive side effect: + it is now possible for external clients, for example other drivers + that call the Modbus driver, to temporarily disable the poller by + calling `pasynManager-\>lockPort()`. This can be used to allow atomic + sequences of Modbus read/write operations with no possibility of + interference from the poller. +- The above fix means that Modbus input drivers can now block on read + operations, because they may need to wait for the poller to + complete. These drivers are thus now created with the ASYN\_CANBLOCK + flag, and the documentation has been changed to state that input + drivers are now asynchronous, not synchronous. +- Changed the wait for interruptAccept in the poller thread. It now + works to have a very long polling time, but still having one initial + read cycle and callback on I/O Intr scanned records. +- Added a new command to the Modbus driver, which has the drvUser + string `MODBUS\_READ`. This command is implemented on the + asynInt32 interface. Calling `asynInt32-\>write()` with this command + causes a Modbus I/O cycle for this driver. It will typically be used + to force a Modbus input driver to do a read operation independent of + the poller thread. +- Added a new test driver called testModbusSyncIO.cpp. This driver is + derived from asynPortDriver. It is designed to demonstrate using + another asyn driver to communicate through the Modbus driver. This + concept is currently being used to have a motor driver that + communicates through the Modbus driver. It demonstrates two types of + communication: + 1. Using pasynInt32SyncIO calls to make `synchronous` calls to + the Modbus driver. These calls are blocking and are queued. + 2. Doing an atomic `read/modify/write` cycle using the following + sequence of operations. This uses `pasynManager-\>lockPort` to + disable the poller and allow this thread to directly call the + `asynInt32-\>write()` and `asynInt32-\>read()` functions. It uses + the following logic: + - Lock the output port. Needed because we are directly calling + the write() function. + - Lock the input port, which disables the poller and because + we are directly calling read(). + - Sleep for 1 second so we can prove the poller was idle. + - Force a read of the Modbus input by writing on asynInt32 + interface with the MODBUS\_READ drvInfo. + - Read the input value on the asynInt32 interface. + - Add the value passed to this function to the current value + just read. + - Sleep for 2 seconds so we can prove the poller was idle. + - Write the new value to the output driver. + - Unlock the input port. + - Unlock the output port. + + This new example driver can be tested with the new files + iocBoot/iocTest/sim3.cmd and sim3.substitutions. +- Minor change to structure packing declarations to allow building on + ARM architecture with GCC 4.2.1 + + +## R2-4 (May 22, 2012) +- Improved support for different Modbus data types. + - Added support for 7 new Modbus data types: + - 16-bit signed integer + - 32-bit integer, little-endian + - 32-bit integer, big-endian + - 32-bit float, little-endian + - 32-bit float, big-endian + - 64-bit float, little-endian + - 64-bit float, big-endian + - Added support to allow the Modbus data type to be specified on a + per-record bas using the asyn drvUser field. Previously all + records connected to a Modbus asyn port driver had the same + Modbus data type, because each Modbus port driver was limited to + a single data type. + - If the drvUser string in the link specification is omitted, or + if it is the default of MODBUS\_DATA then the record will use + the modbusDataType defined in drvModbusAsynConfigure. This is + backwards compatible, and existing IOCs will continue to work + with no changes to databases or startup scripts. + - Added new example IOC script, substitutions file, and medm + screens to test all data types. The testing was done with a + Modbus slave simulator. +- Added special treatment for Wago devices. These device are different + from other Modbus devices because the address to read back a + register is not the same as the address to write the register. The + readback address is the write address plus 0x200. This means that in + previous versions of this driver the initial readback value for + Modbus write operations to Wago devices was incorrect. This was + fixed by adding the 0x200 offset to the readback address if the + plcType argument to drvModbusAsynConfigure contains the substring + `Wago` (case sensitive). +- Added support for passing status information back to device support + in callbacks for I/O Intr scanned records. Support for this was + added in asyn R4-19. This means that if the Modbus device + communications returns errors that I/O Intr scanned records will now + have their alarm status set correctly. + + +## R2-3 (Sept 9, 2011) +- build changes +- added .opi files for CSS-BOY + + +## R2-2 (March 13, 2011) +- R2-0 introduced a 20 ms delay before each Modbus write. This was not + correct, delays should only be needed for serial RTU. The Modicon + Modbus Protocol Reference Guide says this must be at least 3.5 + character times, e.g. about 3.5ms at 9600 baud, for Serial RTU. An + additional writeDelayMsec parameter was added to + modbusInterposeConfig. It is the final parameter, so if it is not + specified the default value is zero, which is appropriate when not + using Serial RTU. In the startup script lines like the following: + + modbusInterposeConfig("Koyo1",0,5000) + + should be changed to: + + modbusInterposeConfig("Koyo1",0,5000,0) + + for no delay, or to: + + modbusInterposeConfig("Koyo1",0,5000,20) + + for a 20 ms delay. + + +## R2-1 (November 7, 2010) +- Bug fix. Non-automatic connection to the Modbus server uses + `pasynCommonSyncIO-\>connectDevice()`. The pasynUser being used for + that operation was being created with `pasynOctetSyncIO-\>connect()`. + That was always an error, it must be created with + `pasynCommonSyncIO-\>connect()`. This error became serious with asyn + R4-14, and non-automatic connection no longer worked. +- Previous releases of modbus recommended setting NoAutoConnect=1 when + configuring the TCP or serial port. That was probably because of + problems in connection management in earlier versions of asyn. With + asyn R4-14 this is no longer necessary, and NoAutoConnect=0, the + normal default, can be used with no problems. The example scripts + Koyo1.cmd and Koyo2.cmd in the iocBoot directory have been changed + to enable automatic connection to the IP or serial driver. + + +## R2-0 (November 26, 2009) +- Moved the slave address handling from the asynInterpose layer to the + Modbus driver layer. This was done because handing it in the the + interpose layer only allowed 1 slave address per asyn serial port or + IP port. This did not allow a single serial port to be used with + multiple Modbus devices on an RS-485 bus, for example. **NOTE: This + requires all startup command scripts to be changed, because the + syntax of the modbusInterposeConfig and drvModbusAsynConfigure + commands has changed.** Thanks to Yves Lussignol from CEA in France + for making these changes. + + +## R1-3 (September 19, 2008) +- Changed modbusInterpose.c to replace `pasynOctet-\>writeRaw()` and + `pasynOctet-\>readRaw()` with `pasynOctet-\>write()` and + `pasynOctet-\>read()`, because the raw routines have been removed in + asyn R4-10. +- Changed the driver to use the asynStandardInterfaces interfaces + added to asyn in R4-10. + + +## R1-2 (September 6, 2007) +- Fixed bug in computing byteCount in WRITE\_MULTIPLE\_COILS function + code. + +There is a known limitation with using serial interfaces. It is not +currently possible to have multiple Modbus servers connected to a single +serial port. This is a limitation of the asynInterposeInterface +architecture used. It is fixed in release 2-0. + + +## R1-1 (April 30, 2007) +- Initial release of modbus module. diff --git a/configure/CONFIG_SITE b/configure/CONFIG_SITE index 212485e..7cf6e1f 100644 --- a/configure/CONFIG_SITE +++ b/configure/CONFIG_SITE @@ -40,4 +40,5 @@ CHECK_RELEASE = YES # file itself. -include $(TOP)/../CONFIG_SITE.local -include $(TOP)/configure/CONFIG_SITE.local +-include $(SUPPORT)/configure/CONFIG_SITE diff --git a/configure/RELEASE b/configure/RELEASE index 94c2de4..9305d36 100644 --- a/configure/RELEASE +++ b/configure/RELEASE @@ -11,18 +11,20 @@ TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top SUPPORT=/corvette/home/epics/devel --include $(TOP)/../configure/SUPPORT.$(EPICS_HOST_ARCH) -ASYN=$(SUPPORT)/asyn-4-31 +ASYN=$(SUPPORT)/asyn-4-43 # If you don't want to install into $(TOP) then # define INSTALL_LOCATION_APP here #INSTALL_LOCATION_APP= # EPICS_BASE usually appears last so other apps can override stuff: -EPICS_BASE=/corvette/usr/local/epics-devel/base-3.15.5 --include $(TOP)/../configure/EPICS_BASE.$(EPICS_HOST_ARCH) +EPICS_BASE=/corvette/usr/local/epics-devel/base-7.0.7 #Capfast users may need the following definitions #CAPFAST_TEMPLATES= #SCH2EDIF_PATH= +-include $(TOP)/../RELEASE.local +-include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local +-include $(TOP)/configure/RELEASE.local + diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..84a633e --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,22 @@ +SPHINX_MULTIBUILD=sphinx-multibuild + +DOCS_PATHS += -i . + +BUILD = _build +SOURCE = source +DOCS = _docs +#OPTS = -v -v -v +OPTS = + +.PHONY: all +all: sphinx + + +.PHONY: all +sphinx: + $(SPHINX_MULTIBUILD) -i $(SOURCE) -s $(DOCS) -o $(BUILD)/html $(OPTS) -b html + +.PHONY: clean +clean: + rm -rf _docs + rm -rf _build diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..46dc423 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,5 @@ +sphinx==1.8.5 +sphinx-bootstrap-theme +m2r2 +sphinx-multibuild +breathe diff --git a/documentation/K1_C20n_In_Word.png b/docs/source/K1_C20n_In_Word.png similarity index 100% rename from documentation/K1_C20n_In_Word.png rename to docs/source/K1_C20n_In_Word.png diff --git a/documentation/K1_C20n_Out_Bit.png b/docs/source/K1_C20n_Out_Bit.png similarity index 100% rename from documentation/K1_C20n_Out_Bit.png rename to docs/source/K1_C20n_Out_Bit.png diff --git a/documentation/K1_Cn_In_Bit_Array.png b/docs/source/K1_Cn_In_Bit_Array.png similarity index 100% rename from documentation/K1_Cn_In_Bit_Array.png rename to docs/source/K1_Cn_In_Bit_Array.png diff --git a/documentation/K1_Cn_In_Word_Array.png b/docs/source/K1_Cn_In_Word_Array.png similarity index 100% rename from documentation/K1_Cn_In_Word_Array.png rename to docs/source/K1_Cn_In_Word_Array.png diff --git a/documentation/K1_Xn_Bit.png b/docs/source/K1_Xn_Bit.png similarity index 100% rename from documentation/K1_Xn_Bit.png rename to docs/source/K1_Xn_Bit.png diff --git a/documentation/K1_Xn_Bit_Statistics.png b/docs/source/K1_Xn_Bit_Statistics.png similarity index 100% rename from documentation/K1_Xn_Bit_Statistics.png rename to docs/source/K1_Xn_Bit_Statistics.png diff --git a/documentation/K1_Yn_In_Word.png b/docs/source/K1_Yn_In_Word.png similarity index 100% rename from documentation/K1_Yn_In_Word.png rename to docs/source/K1_Yn_In_Word.png diff --git a/documentation/K1_Yn_Out_Bit_Asyn.png b/docs/source/K1_Yn_Out_Bit_Asyn.png similarity index 100% rename from documentation/K1_Yn_Out_Bit_Asyn.png rename to docs/source/K1_Yn_Out_Bit_Asyn.png diff --git a/documentation/K1_Yn_Out_Bit_AsynRegister.png b/docs/source/K1_Yn_Out_Bit_AsynRegister.png similarity index 100% rename from documentation/K1_Yn_Out_Bit_AsynRegister.png rename to docs/source/K1_Yn_Out_Bit_AsynRegister.png diff --git a/documentation/K1_Yn_Out_Word.png b/docs/source/K1_Yn_Out_Word.png similarity index 100% rename from documentation/K1_Yn_Out_Word.png rename to docs/source/K1_Yn_Out_Word.png diff --git a/documentation/K2_ADCs.png b/docs/source/K2_ADCs.png similarity index 100% rename from documentation/K2_ADCs.png rename to docs/source/K2_ADCs.png diff --git a/documentation/Koyo1.png b/docs/source/Koyo1.png similarity index 100% rename from documentation/Koyo1.png rename to docs/source/Koyo1.png diff --git a/documentation/Koyo2.png b/docs/source/Koyo2.png similarity index 100% rename from documentation/Koyo2.png rename to docs/source/Koyo2.png diff --git a/documentation/Modbus_Application_Protocol_V1_1b.pdf b/docs/source/Modbus_Application_Protocol_V1_1b.pdf similarity index 100% rename from documentation/Modbus_Application_Protocol_V1_1b.pdf rename to docs/source/Modbus_Application_Protocol_V1_1b.pdf diff --git a/documentation/Modbus_Messaging_Implementation_Guide_V1_0b.pdf b/docs/source/Modbus_Messaging_Implementation_Guide_V1_0b.pdf similarity index 100% rename from documentation/Modbus_Messaging_Implementation_Guide_V1_0b.pdf rename to docs/source/Modbus_Messaging_Implementation_Guide_V1_0b.pdf diff --git a/documentation/Modbus_over_serial_line_V1_02.pdf b/docs/source/Modbus_over_serial_line_V1_02.pdf similarity index 100% rename from documentation/Modbus_over_serial_line_V1_02.pdf rename to docs/source/Modbus_over_serial_line_V1_02.pdf diff --git a/docs/source/_extra/.keepdir b/docs/source/_extra/.keepdir new file mode 100644 index 0000000..e69de29 diff --git a/docs/source/_static/css/my_theme.css b/docs/source/_static/css/my_theme.css new file mode 100644 index 0000000..d61a819 --- /dev/null +++ b/docs/source/_static/css/my_theme.css @@ -0,0 +1,19 @@ +@import url("theme.css"); + +.wy-nav-content { + max-width: 90%; +} + +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} diff --git a/docs/source/_static/theme_overrides.css b/docs/source/_static/theme_overrides.css new file mode 100644 index 0000000..63ee6cc --- /dev/null +++ b/docs/source/_static/theme_overrides.css @@ -0,0 +1,13 @@ +/* override table width restrictions */ +@media screen and (min-width: 767px) { + + .wy-table-responsive table td { + /* !important prevents the common CSS stylesheets from overriding + this as on RTD they are loaded after this stylesheet */ + white-space: normal !important; + } + + .wy-table-responsive { + overflow: visible !important; + } +} diff --git a/docs/source/acknowledgments.rst b/docs/source/acknowledgments.rst new file mode 100644 index 0000000..120ad7d --- /dev/null +++ b/docs/source/acknowledgments.rst @@ -0,0 +1,10 @@ +Acknowledgments +--------------- + +The **modbus** package is based on the `modtcp and plctcp +packages `__ +written by Rolf Keitel from Triumf. The **modtcp** package was +originally converted to Linux by Ivan So from NSLS. **modbus** was +extensively re-written for conversion to EPICS 3.14 and to use the EPICS +asyn module. It now contains little of the original **modtcp** code, but +retains much of the original architecture. diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..8a1f834 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,39 @@ +# +# modbys documentation + +import sys, os + +project = 'modbus' +html_title = html_short_title = 'EPICS support for Modbus' + +authors = 'Mark Rivers' +copyright = '2023, Mark Rivers' + +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.mathjax', + 'sphinx.ext.extlinks', + 'sphinx.ext.napoleon'] + +todo_include_todos = True + +templates_path = ['_templates'] +source_suffix = '.rst' +source_encoding = 'utf-8' +master_doc = 'index' +today_fmt = '%Y-%B-%d' + +exclude_trees = ['_build'] + +add_function_parentheses = True +add_module_names = False +pygments_style = 'sphinx' + +# html themes: 'default', 'sphinxdoc', 'alabaster', 'agogo', 'nature', 'pyramid' +#html_theme = 'pyramid' +html_theme = 'sphinx_rtd_theme' + +html_static_path = ['_static'] +html_style = 'css/my_theme.css' +html_last_updated_fmt = '%Y-%B-%d' +html_show_sourcelink = True +htmlhelp_basename = 'modbus_doc' diff --git a/docs/source/creating_driver.rst b/docs/source/creating_driver.rst new file mode 100644 index 0000000..cc084e9 --- /dev/null +++ b/docs/source/creating_driver.rst @@ -0,0 +1,457 @@ +Creating a **modbus** port driver +--------------------------------- + +Before **modbus** port drivers can be created, it is necessary to first +create at least one asyn TCP/IP or serial port driver to communicate +with the hardware. The commands required depend on the communications +link being used. + +TCP/IP +~~~~~~ + +For TCP/IP use the following standard asyn command: + +:: + + drvAsynIPPortConfigure(portName, hostInfo, priority, noAutoConnect, noProcessEos) + +Documentation on this command can be found in the `asynDriver +documentation `__. + +The following example creates an asyn IP port driver called "Koyo1" on +port 502 at IP address 164.54.160.158. The default priority is used and +the noAutoConnect flag is set to 0 so that asynManager will do normal +automatic connection management. Note that the noProcessEos flag is set to 0 +so it is using the asynInterposeEos interface. +The asynInterposeEos interface handles end-of-string (EOS) processing, which is not needed for Modbus TCP. +However, it also handles issuing repeated read requests until the requested number of bytes +has been received, which the low-level asyn IP port driver does not do. +Normally Modbus TCP sends responses in a single packet, so this may not be needed, but using +the asynInterpose interface does no harm. +However, the asynInterposeEos interface is definitely needed when using drvAsynIPPortConfigure to talk +to a terminal server that is communicating with the Modbus device over Modbus RTU or ASCII, +because then the communication from the device may well be broken up into multiple packets. + +:: + + drvAsynIPPortConfigure("Koyo1","164.54.160.158:502",0,0,0) + +Serial RTU +~~~~~~~~~~ + +For serial RTU use the following standard asyn commands +This is recommended even when using actual: + +:: + + drvAsynSerialPortConfigure(portName, ttyName, priority, noAutoConnect, noProcessEos) + asynSetOption(portName, addr, key, value) + +Documentation on these commands can be found in the `asynDriver +documentation `__. + +The following example creates an asyn local serial port driver called +"Koyo1" on /dev/ttyS1. The default priority is used and the +noAutoConnect flag is set to 0 so that asynManager will do normal +automatic connection management. The noProcessEos flag is set to 0 +because Modbus over serial requires end-of-string processing. The serial +port parameters are configured to 38400 baud, no parity, 8 data bits, 1 +stop bit. + +:: + + drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0) + asynSetOption("Koyo1",0,"baud","38400") + asynSetOption("Koyo1",0,"parity","none") + asynSetOption("Koyo1",0,"bits","8") + asynSetOption("Koyo1",0,"stop","1") + +Serial ASCII +~~~~~~~~~~~~ + +For serial ASCII use the same commands described above for serial RTU. +After the asynSetOption commands use the following standard asyn +commands: + +:: + + asynOctetSetOutputEos(portName, addr, eos) + asynOctetSetInputEos(portName, addr, eos) + +Documentation on these commands can be found in the `asynDriver +documentation `__. + +The following example creates an asyn local serial port driver called +"Koyo1" on /dev/ttyS1. The default priority is used and the +noAutoConnect flag is set to 0 so that asynManager will do normal +automatic connection management. The noProcessEos flag is set to 0 +because Modbus over serial requires end-of-string processing. The serial +port parameters are configured to 38400 baud, no parity, 8 data bits, 1 +stop bit. The input and output end-of-string is set to CR/LF. + +:: + + drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0) + asynSetOption("Koyo1",0,"baud","38400") + asynSetOption("Koyo1",0,"parity","none") + asynSetOption("Koyo1",0,"bits","8") + asynSetOption("Koyo1",0,"stop","1") + asynOctetSetOutputEos("Koyo1",0,"\r\n") + asynOctetSetInputEos("Koyo1",0,"\r\n") + +modbusInterposeConfig +~~~~~~~~~~~~~~~~~~~~~ + +After creating the asynIPPort or asynSerialPort driver, the next step is +to add the asyn "interpose interface" driver. This driver takes the +device-independent Modbus frames and adds or removes the +communication-link specific information for the TCP, RTU, or ASCII link +protocols. The interpose driver is created with the command: + +:: + + modbusInterposeConfig(portName, + linkType, + timeoutMsec, + writeDelayMsec) + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Parameter + - Data type + - Description + * - portName + - string + - Name of the asynIPPort or asynSerialPort previously created. + * - linkType + - int + - Modbus link layer type:, 0 = TCP/IP, 1 = RTU, 2 = ASCII + * - timeoutMsec + - int + - The timeout in milliseconds for write and read operations to the underlying asynOctet + driver. This value is used in place of the timeout parameter specified in EPICS + device support. If zero is specified then a default timeout of 2000 milliseconds + is used. + * - writeDelayMsec + - int + - The delay in milliseconds before each write from EPICS to the device. This is typically + only needed for Serial RTU devices. The Modicon Modbus Protocol Reference Guide + says this must be at least 3.5 character times, e.g. about 3.5ms at 9600 baud, for + Serial RTU. The default is 0. + +For the serial ASCII example above, after the asynOctetSetInputEos +command, the following command would be used. This uses a timeout of 1 +second, and a write delay of 0 ms. + +:: + + modbusInterposeConfig("Koyo1",2,1000,0) + +drvModbusAsynConfigure +~~~~~~~~~~~~~~~~~~~~~~ + +Once the asyn IP or serial port driver has been created, and the +modbusInterpose driver has been configured, a **modbus** port driver is +created with the following command: + +:: + + drvModbusAsynConfigure(portName, + tcpPortName, + slaveAddress, + modbusFunction, + modbusStartAddress, + modbusLength, + dataType, + pollMsec, + plcType); + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Parameter + - Data type + - Description + * - portName + - string + - Name of the **modbus** port to be created. + * - tcpPortName + - string + - Name of the asyn IP or serial port previously created. + * - slaveAddress + - int + - The address of the Modbus slave. This must match the configuration of the Modbus + slave (PLC) for RTU and ASCII. For TCP the slave address is used for the "unit identifier", + the last field in the MBAP header. The "unit identifier" is ignored by most PLCs, + but may be required by some. + * - modbusFunction + - int + - Modbus function code (1, 2, 3, 4, 5, 6, 15, 16, 123 (for 23 read-only), or 223 (for + 23 write-only)). + * - modbusStartAddress + - int + - Start address for the Modbus data segment to be accessed. For relative addressing + this must be in the range 0-65535 decimal, or 0-0177777 octal. For absolute addressing + this must be set to -1. + * - modbusLength + - int + - The length of the Modbus data segment to be accessed. + This is specified in bits for Modbus functions 1, 2, 5 and 15. + It is specified in 16-bit words for Modbus functions 3, 4, 6, 16, or 23. + Length limit is 2000 for functions 1 and 2, 1968 for functions 5 and 15, 125 for functions 3 and 4, + and 123 for functions 6, 16, and 23. + For absolute addressing this must be set to the size of required by the largest + single Modbus operation that may be used. This would be 1 if all Modbus reads and + writes are for 16-bit registers, but it would be 4 if 64-bit floats (4 16-bit registers) + are being used, and 100 (for example) if an Int32 waveform record with NELM=100 + is being read or written. + * - modbusDataType + - string + - This sets the default data type for this port. This is the data type used if the + drvUser field of a record is empty, or if it is MODBUS_DATA. The supported Modbus + data type strings are listed in the table below. This argument can either be one of the + strings shown in the table below, and defined in `drvModbusAsyn.h`, or it can be the + numeric `modbusDataType_t` enum also defined in `drvModbusAsyn.h`. The enum values + are less convenient and understandable then the string equivalents. + NOTE: the enum values changed between R3-0 and R3-1, which may require changes + to startup scripts. INT16 and UINT16 were swapped and everything beyond + INT32_LE is different. + * - pollMsec + - int + - Polling delay time in msec for the polling thread for read functions. + For write functions, a non-zero value means that the Modbus data should, be read once when the port driver is first created. + * - plcType + - string + - Type of PLC (e.g. Koyo, Modicon, etc.). + This parameter is currently used to print information in asynReport. + It is also used to treat Wago devices specially if the plcType string contains the + substring "Wago". See the note below. + +Modbus register data types +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Modbus function codes 3, 4, 6, and 16 are used to access 16-bit +registers. The Modbus specification does not define how the data in +these registers is to be interpreted, for example as signed or unsigned +numbers, binary coded decimal (BCD) values, etc. In fact many +manufacturers combine multiple 16-bit registers to encode 32-bit +integers, 32-bit or 64-bit floats, etc. The following table lists the +data types supported by **modbus**. The default data type for the port +is defined with the modbusDataType parameter described above. The data +type for particular record can override the default by specifying a +different data type with the drvUser field in the link. The driver uses +this information to convert the number between EPICS device support and +Modbus. Data is transferred to and from EPICS device support as +epicsUInt32, epicsInt32, epicsInt64, and epicsFloat64 numbers. Note that the data +type conversions described in this table only apply for records using +the asynInt32, asynInt64, or asynFloat64 interfaces, they do not apply when using +the asynUInt32Digital interface. The asynUInt32Digital interface always +treats the registers as unsigned 16-bit integers. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - drvUser field + - Description + * - INT16 + - 16-bit signed (2's complement) integers. This data type extends the sign bit when + converting to epicsInt32. + * - INT16SM + - 16-bit binary integers, sign and magnitude format. In this format bit 15 is the + sign bit, and bits 0-14 are the absolute value of the magnitude of the number. This + is one of the formats used, for example, by Koyo PLCs for numbers such as ADC conversions. + * - BCD_UNSIGNED + - Binary coded decimal (BCD), unsigned. This data type is for a 16-bit number consisting + of 4 4-bit nibbles, each of which encodes a decimal number from 0-9. A BCD number + can thus store numbers from 0 to 9999. Many PLCs store some numbers in BCD format. + * - BCD_SIGNED + - 4-digit binary coded decimal (BCD), signed. This data type is for a 16-bit number + consisting of 3 4-bit nibbles, and one 3-bit nibble. Bit 15 is a sign bit. Signed + BCD numbers can hold values from -7999 to +7999. This is one of the formats used + by Koyo PLCs for numbers such as ADC conversions. + * - UINT16 + - Unsigned 16-bit binary integers. + * - INT32_LE + - 32-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+1). + * - INT32_LE_BS + - 32-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+1). Bytes within each word are swapped. + * - INT32_BE + - 32-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+1). + * - INT32_BE_BS + - 32-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+1). Bytes within each word are swapped. + * - UINT32_LE + - Unsigned 32-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+1). + * - UINT32_LE_BS + - Unsigned 32-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+1). Bytes within each word are swapped. + * - UINT32_BE + - Unsigned 32-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+1). + * - UINT32_BE_BS + - Unsigned 32-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+1). Bytes within each word are swapped. + * - INT64_LE + - 64-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+3). + * - INT64_LE_BS + - 64-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+3). Bytes within each word are swapped. + * - INT64_BE + - 64-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+3). + * - INT64_BE_BS + - 64-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+3). Bytes within each word are swapped. + * - UINT64_LE + - Unsigned 64-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+3). + * - UINT64_LE_BS + - Unsigned 64-bit integers, little endian (least significant word at Modbus address N, most + significant word at Modbus address N+3). Bytes within each word are swapped. + * - UINT64_BE + - Unsigned 64-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+3). + * - UINT64_BE_BS + - Unsigned 64-bit integers, big endian (most significant word at Modbus address N, least significant + word at Modbus address N+3). Bytes within each word are swapped. + * - FLOAT32_LE + - 32-bit floating point, little endian (least significant word at Modbus address N, + most significant word at Modbus address N+1). + * - FLOAT32_LE_BS + - 32-bit floating point, little endian (least significant word at Modbus address N, + most significant word at Modbus address N+1). Bytes within each word are swapped. + * - FLOAT32_BE + - 32-bit floating point, big endian (most significant word at Modbus address N, least + significant word at Modbus address N+1). + * - FLOAT32_BE_BS + - 32-bit floating point, big endian (most significant word at Modbus address N, least + significant word at Modbus address N+1). Bytes within each word are swapped. + * - FLOAT64_LE + - 64-bit floating point, little endian (least significant word at Modbus address N, + most significant word at Modbus address N+3). + * - FLOAT64_LE_BS + - 64-bit floating point, little endian (least significant word at Modbus address N, + most significant word at Modbus address N+3). Bytes within each word are swapped. + * - FLOAT64_BE + - 64-bit floating point, big endian (most significant word at Modbus address N, least + significant word at Modbus address N+3). + * - FLOAT64_BE_BS + - 64-bit floating point, big endian (most significant word at Modbus address N, least + significant word at Modbus address N+3). Bytes within each word are swapped. + * - STRING_HIGH + - String data. One character is stored in the high byte of each register. + * - STRING_LOW + - String data. One character is stored in the low byte of each register. + * - STRING_HIGH_LOW + - String data. Two characters are stored in each register, the first in the high byte + and the second in the low byte. + * - STRING_LOW_HIGH + - String data. Two characters are stored in each register, the first in the low byte + and the second in the high byte. + * - ZSTRING_HIGH + - Zero terminated string data. One character is stored in the high byte of each register. + * - ZSTRING_LOW + - Zero terminated string data. One character is stored in the low byte of each register. + * - ZSTRING_HIGH_LOW + - Zero terminated string data. Two characters are stored in each register, the first in the high byte + and the second in the low byte. + * - ZSTRING_LOW_HIGH + - Zero terminated string data. Two characters are stored in each register, the first in the low byte + and the second in the high byte. + +NOTE: if it is desired to transmit BCD numbers untranslated to EPICS +over the asynInt32 interface, then data type 0 should be used, because +no translation is done in this case. + +NOTE: the ZSTRING_* types are meant for output records. +For input records they are identical to their STRING_* counterparts. + +NOTE: For big-endian formats the _BE format is order in which an IEEE value would +be stored on a big-endian machine, and _BE_BS swaps the bytes in each 16-bit word +relative to IEEE specification. +However, for little-endian formats the _LE format is byte-swapped within each 16-bit word +compared how the IEEE value would be be stored on a little-endian machine. +The _LE_BS format is the order in which an IEEE value would be stored on a little-endian machine. +This is done for backwards compatibility, because that is how _LE has always been stored in +previous versions of this modbus module, before the byte-swapped formats were added. + +The following is an example ai record using 32-bit floating point +values: + +:: + + # ai record template for register inputs + record(ai, "$(P)$(R)") { + field(DTYP,"asynFloat64") + field(INP,"@asyn($(PORT) $(OFFSET))FLOAT32_LE") + field(HOPR,"$(HOPR)") + field(LOPR,"$(LOPR)") + field(PREC,"$(PREC)") + field(SCAN,"$(SCAN)") + } + +Note for Wago devices +~~~~~~~~~~~~~~~~~~~~~ + +This initial read operation is normally done at the same Modbus address +as the write operations. However, Wago devices are different from other +Modbus devices because the address to read back a register is not the +same as the address to write the register. For Wago devices the address +used to read back the initial value for a Modbus write function must be +0x200 greater than the address for the write function. This is handled +by adding this 0x200 offset for the readback address if the plcType +argument to drvModbusAsynConfigure contains the substring "Wago" (case +sensitive). Note that this does not affect the address for Wago read +functions. The user must specify the actual Modbus address for read +functions. + +Number of drvAsynIPPort drivers for TCP +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Each drvAsynIPPort driver creates a separate TCP/IP socket connection to +the PLC. It is possible to have all of the **modbus** port drivers share +a single drvAsynIPPort driver. In this case all I/O to the PLC is done +over a single socket in a "serial" fashion. A transaction for one +**modbus** driver must complete before a transaction for another +**modbus** driver can begin. It is also possible to create multiple +drvAsynIPPort drivers (sockets) to a single PLC and, for example, use a +different drvAsynIPPort for each **modbus** port. In this case I/O +operations from multiple **modbus** drivers can proceed in parallel, +rather than serially. This could improve performance at the expense of +more CPU load on the IOC and PLC, and more network traffic. + +It is important to note, however, that many PLCs will time out sockets +after a few seconds of inactivity. This is not a problem with **modbus** +drivers that use read function codes, because they are polling +frequently. But **modbus** drivers that use write function codes may +only do occasional I/O, and hence may time out if they are the only ones +communicating through a drvAsynIPPort driver. Thus, it is usually +necessary for **modbus** drivers with write function codes to use the +same drvAsynIPPort driver (socket) as at least one **modbus** driver +with a read function code to avoid timeouts. + +The choice of how many drvAsynIPPort drivers to use per PLC will be +based on empirical performance versus resource usage considerations. In +general it is probably a good idea to start with one drvAsynIPPort +server per PLC (e.g. shared by all **modbus** drivers for that PLC) and +see if this results in satisfactory performance. + +Number formats +~~~~~~~~~~~~~~ + +It can be convenient to specify the modbusStartAddress and modbusLength +in octal, rather than decimal, because this is the convention on most +PLCs. In the iocsh and vxWorks shells this is done by using a leading 0 +on the number, i.e. 040400 is an octal number. \ No newline at end of file diff --git a/docs/source/debugging.rst b/docs/source/debugging.rst new file mode 100644 index 0000000..7c39a83 --- /dev/null +++ b/docs/source/debugging.rst @@ -0,0 +1,137 @@ +Debug tracing +------------- + +One can obtain diagnostic output for a **modbus** port driver using the +"dbior" or "asynPrint" commands at the iocsh or vxWorks shell. +"asynReport" with no arguments will print a brief report for all asyn +drivers, including the drvAsynIPPort or drvAsynSerialPort driver that +**modbus** drivers are connected to, and for all **modbus** port +drivers. For example, a partial output for the Koyo1 application when it +is connected via TCP is: + +:: + + epics> asynReport + Koyo1 multiDevice:No canBlock:Yes autoConnect:No + Port 164.54.160.158:502: Connected + K1_Xn_Bit multiDevice:Yes canBlock:No autoConnect:Yes + addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 1 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 2 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 3 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 4 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 5 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 6 autoConnect Yes enabled Yes connected Yes exceptionActive No + addr 7 autoConnect Yes enabled Yes connected Yes exceptionActive No + modbus port: K1_Xn_Bit + K1_Xn_Word multiDevice:Yes canBlock:No autoConnect:Yes + addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No + +To obtain more detailed information, one can request information for a +specific **modbus** port driver, and output level >0 as follows: + +:: + + epics> asynReport 5, "K1_Xn_Word" + K1_Xn_Word multiDevice:Yes canBlock:No autoConnect:Yes + enabled:Yes connected:Yes numberConnects 1 + nDevices 1 nQueued 0 blocked:No + asynManagerLock:No synchronousLock:No + exceptionActive:No exceptionUsers 0 exceptionNotifys 0 + interfaceList + asynCommon pinterface 0x4001d180 drvPvt 0x8094f78 + asynDrvUser pinterface 0x4001d10c drvPvt 0x8094f78 + asynUInt32Digital pinterface 0x4001d118 drvPvt 0x8094f78 + asynInt32 pinterface 0x4001d134 drvPvt 0x8094f78 + asynFloat64 pinterface 0x4001d148 drvPvt 0x8094f78 + asynInt32Array pinterface 0x4001d158 drvPvt 0x8094f78 + addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No + exceptionActive No exceptionUsers 1 exceptionNotifys 0 + blocked No + modbus port: K1_Xn_Word + asyn TCP server: Koyo1 + modbusFunction: 3 + modbusStartAddress: 040400 + modbusLength: 010 + plcType: Koyo + I/O errors: 0 + Read OK: 5728 + Write OK: 0 + pollDelay: 0.100000 + Time for last I/O 3 msec + Max. I/O time: 12 msec + +To obtain run-time debugging output for a driver use the +asynSetTraceMask and asynSetTraceIOMask commands. For example the +following commands will show all I/O to and from the PLC from the +underlying drvAsynIPPort driver: + +:: + + epics> asynSetTraceIOMask "Koyo1",0,4 # Enable traceIOHex + epics> asynSetTraceMask "Koyo1",0,9 # Enable traceError and traceIODriver + epics> + 2007/04/12 17:27:45.384 164.54.160.158:502 write 12 + + 00 01 00 00 00 07 ff 02 08 00 00 20 + 2007/04/12 17:27:45.390 164.54.160.158:502 read 13 + + 00 01 00 00 00 07 ff 02 04 00 00 00 00 + 2007/04/12 17:27:45.424 164.54.160.158:502 write 12 + + 00 01 00 00 00 07 ff 03 41 00 00 08 + 2007/04/12 17:27:45.432 164.54.160.158:502 read 25 + + 00 01 00 00 00 13 ff 03 10 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 + ... + epics> asynSetTraceMask "Koyo1",0,1 # Turn off traceIODriver + +The following command shows the I/O from a specific **modbus** port +driver: + +:: + + epics> asynSetTraceIOMask "K1_Yn_In_Word",0,4 # Enable traceIOHex + epics> asynSetTraceMask "K1_Yn_In_Word",0,9 # Enable traceError and traceIODriver + epics> + 2007/04/12 17:32:31.548 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS + 09 00 00 00 00 00 00 00 + 2007/04/12 17:32:31.656 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS + 09 00 00 00 00 00 00 00 + 2007/04/12 17:32:31.770 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS + 09 00 00 00 00 00 00 00 + 2007/04/12 17:32:31.878 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS + 09 00 00 00 00 00 00 00 + 2007/04/12 17:32:31.987 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS + 09 00 00 00 00 00 00 00 + epics> asynSetTraceMask "K1_Yn_In_Word",0,1 # Disable traceIODriver + +One can also load an EPICS asyn record on a **modbus** port, and then +use EPICS channel access to turn debugging output on and off. The +following medm screen shows how to turn on I/O tracing using this +method. + +asynRecord.adl +~~~~~~~~~~~~~~ +Using the asynRecord to turn on traceIODriver and traceIOHex for debugging. + +.. figure:: K1_Yn_In_Word.png + :align: center + +The asyn record can also be used to perform actual I/O to the PLC. +For example the following screen shots shows the asyn record being used to control output Y1 on a PLC. +Note that the ADDR field is set to 1 (to select Y1) and the data set to 1 (to turn on the output). +Each time the asyn record is processed the value will be sent to the PLC. + +.. figure:: K1_Yn_Out_Bit_Asyn.png + :align: center + +asynRegister.adl +~~~~~~~~~~~~~~~~ +Using the asynRecord to perform actual I/O to a PLC. +Note that Interface (IFACE)=asynUInt32Digital, Transfer (TMOD)=Write, and Output (UI32OUT)=1. +This value will be written to the Y1 output when the record is processed. + +.. figure:: K1_Yn_Out_Bit_AsynRegister.png + :align: center \ No newline at end of file diff --git a/docs/source/device_support.rst b/docs/source/device_support.rst new file mode 100644 index 0000000..f5298be --- /dev/null +++ b/docs/source/device_support.rst @@ -0,0 +1,648 @@ +EPICS device support +-------------------- + +**modbus** implements the following standard asyn interfaces: + +- asynUInt32Digital +- asynInt32 +- asynInt32Array +- asynInt64 +- asynFloat64 +- asynOctet +- asynCommon +- asynDrvUser + +Because it implements these standard interfaces, EPICS device support is +done entirely with the generic EPICS device support provided with asyn +itself. There is no special device support provided as part of +**modbus**. + +It is necessary to use asyn R4-8 or later, because some minor +enhancements were made to asyn to support the features required by +**modbus**. + +The following tables document the asyn interfaces used by the EPICS +device support. + +The **drvUser** parameter is used by the driver to determine what +command is being sent from device support. The default is MODBUS_DATA, +which is thus optional in the link specification in device support. If +no **drvUser** field is specified, or if MODBUS_DATA is specified, then +the Modbus data type for records using the asynInt32, asynInt64, and asynFloat64 +interfaces is the default data type specified in the +drvModbusAsynConfigure command. Records can override the default Modbus +data type by specifying datatype-specific **drvUser** field, e.g. +BCD_SIGNED, INT16, FLOAT32_LE, etc. + +The **offset** parameter is used to specify the location of the data for +a record relative to the starting Modbus address for that driver. This +**offset** is specified in bits for drivers using Modbus functions 1, 2, +5, and 15 that control discrete inputs or coils. For example, if the +Modbus function is 2 and the Modbus starting address is 04000, then +**offset=2** refers to address 04002. For a Koyo PLC the X inputs are at +this Modbus starting address for Modbus function 2, so **offset=2** is +input X2. + +If absolute addressing is being used then the **offset** parameter is an +absolute 16-bit Modbus address, and is not relative to the starting +Modbus address, which is -1. + +The **offset** is specified in words for drivers using Modbus functions +3, 4, 6 and 16 that address input registers or holding registers. For +example, if the Modbus function is set to 6 and the Modbus address is +040600 then **offset=2** refers to address 040602. For a Koyo PLC the C +control relays are accessed as 16-bit words at this Modbus starting +address for Modbus function 6. **offset=2** will thus write to the third +16 bit-word, which is coils C40-C57. + +For 32-bit or 64-bit data types (INT32_LE, INT32_BE, FLOAT32_LE, +FLOAT32_BE) the **offset** specifies the location of the first 16-bit +register, and the second register is at **offset+1**, etc. + +For string data types (STRING_HIGH, STRING_LOW, STRING_HIGH_LOW, +STRING_LOW_HIGH, ZSTRING_HIGH, ZSTRING_LOW, ZSTRING_HIGH_LOW, +ZSTRING_LOW_HIGH) the **offset** specifies the location of the first +16-bit register, and the second register is at **offset+1**, etc. + +asynUInt32Digital +~~~~~~~~~~~~~~~~~ + +asynUInt32Digital device support is selected with + +:: + + field(DTYP,"asynUInt32Digital") + field(INP,"@asynMask(portName,offset,mask,timeout)drvUser") + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Modbus function + - Offset type + - Data type + - drvUser + - Records supported + - Description + * - 1, 2 + - Bit + - Single bit + - MODBUS_DATA + - bi, mbbi, mbbiDirect, longin + - value = (Modbus data & mask), (normally mask=1) + * - 3, 4, 23 + - 16-bit word + - 16-bit word + - MODBUS_DATA + - bi, mbbi, mbbiDirect, longin + - value = (Modbus data & mask), (mask selects bits of interest) + * - 5 + - Bit + - Single bit + - MODBUS_DATA + - bo, mbbo, mbboDirect, longout + - Modbus write (value & mask), (normally mask=1) + * - 6, 16 + - 16-bit word + - 16-bit word + - MODBUS_DATA + - bo, mbbo, mbboDirect, longout + - If mask==0 or mask==0xFFFF does Modbus write (value). + Else does read/modify/write:Sets bits that are set in value and set in mask. + Clears bits that are clear in value and set in mask. + * - Any + - NA + - NA + - ENABLE_HISTOGRAM + - bi, mbbi, mbbiDirect, longin + - Returns 0/1 if I/O time histogramming is disabled/enabled in driver. + * - Any + - NA + - NA + - ENABLE_HISTOGRAM + - bo, mbbo, mbboDirect, longout + - If value = 0/1 then disable/enable I/O time histogramming in driver. + +asynInt32 +~~~~~~~~~ + +asynInt32 device support is selected with + +:: + + field(DTYP,"asynInt32") + field(INP,"@asyn(portName,offset,timeout)drvUser") + + +or + +:: + + field(INP,"@asynMask(portName,offset,nbits,timeout)drvUser") + + +The asynMask syntax is used for analog I/O devices, in order to specify +the number of bits in the device. This is required for Modbus because +the driver only knows that it is returning a 16-bit register, but not +the actual number of bits in the device, and hence cannot return +meaningful data with asynInt32->getBounds(). + +nbits>0 for a unipolar device. For example, nbits=12 means unipolar +12-bit device, with a range of 0 to 4095. nbits<0 for a bipolar device. +For example, nbits=-12 means bipolar 12-bit device, with a range of +-2048 to 2047) + +Note: when writing 32-bit or 64-bit values function code 16 should be +used if the device supports it. The write will then be "atomic". If +function code 6 is used then the data will be written in multiple +messages, and there will be an short time period in which the device has +incorrect data. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Modbus function + - Offset type + - Data type + - drvUser + - Records supported + - Description + * - 1, 2 + - Bit + - Single bit + - MODBUS_DATA + - ai, bi, mbbi, longin + - value = (epicsUInt32)Modbus data + * - 3, 4, 23 + - 16-bit words + - 16, 32, or 64-bit word + - MODBUS_DATA (or datatype-specific value) + - ai, mbbi, longin + - value = (epicsInt32)Modbus data + * - 5 + - Bit + - Single bit + - MODBUS_DATA + - ao, bo, mbbo, longout + - Modbus write value + * - 6, 16, 23 + - 16-bit words + - 16, 32, or 64-bit word + - MODBUS_DATA (or datatype-specific value) + - ao, mbbo, longout + - Modbus write value + * - Any + - NA + - NA + - MODBUS_READ + - ao, bo, longout + - Writing to a Modbus input driver with this drvUser value will force the poller thread + to run once immediately, regardless of the value of POLL_DELAY. + * - Any + - NA + - NA + - READ_OK + - ai, longin + - Returns number of successful read operations on this asyn port + * - Any + - NA + - NA + - WRITE_OK + - ai, longin + - Returns number of successful write operations on this asyn port + * - Any + - NA + - NA + - IO_ERRORS + - ai, longin + - Returns number of I/O errors on this asyn port + * - Any + - NA + - NA + - LAST_IO_TIME + - ai, longin + - Returns number of milliseconds for last I/O operation + * - Any + - NA + - NA + - MAX_IO_TIME + - ai, longin + - Returns maximum number of milliseconds for I/O operations + * - Any + - NA + - NA + - HISTOGRAM_BIN_TIME + - ao, longout + - Sets the time per bin in msec in the statistics histogram + +asynInt64 +~~~~~~~~~ + +asynInt64 device support is selected with + +:: + + field(DTYP,"asynInt64") + field(INP,"@asyn(portName,offset,timeout)drvUser") + +Note: when writing 32-bit or 64-bit values function code 16 should be +used if the device supports it. The write will then be "atomic". If +function code 6 is used then the data will be written in multiple +messages, and there will be an short time period in which the device has +incorrect data. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Modbus function + - Offset type + - Data type + - drvUser + - Records supported + - Description + * - 1, 2 + - Bit + - Single bit + - MODBUS_DATA + - ai, longin, int64in + - value = (epicsUInt64)Modbus data + * - 3, 4, 23 + - 16-bit words + - 16, 32, or 64-bit word + - MODBUS_DATA (or datatype-specific value) + - ai, longin, int64in + - value = (epicsInt64)Modbus data + * - 5 + - Bit + - Single bit + - MODBUS_DATA + - ao, longout, int64out + - Modbus write value + * - 6, 16, 23 + - 16-bit words + - 16, 32, or 64-bit word + - MODBUS_DATA (or datatype-specific value) + - ao, longout, int64out + - Modbus write value + +asynFloat64 +~~~~~~~~~~~ + +asynFloat64 device support is selected with + +:: + + field(DTYP,"asynFloat64") + field(INP,"@asyn(portName,offset,timeout)drvUser") + +Note: when writing 32-bit or 64-bit values function code 16 should be +used if the device supports it. The write will then be "atomic". If +function code 6 is used then the data will be written in multiple +messages, and there will be an short time period in which the device has +incorrect data. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Modbus function + - Offset type + - Data type + - drvUser + - Records supported + - Description + * - 1, 2 + - Bit + - Single bit + - MODBUS_DATA + - ai + - value = (epicsFloat64)Modbus data + * - 3, 4, 23 + - 16-bit words + - 16, 32, or 64-bit word + - MODBUS_DATA (or datatype-specific value) + - ai + - value = (epicsFloat64)Modbus data + * - 5 + - Bit + - Single bit + - MODBUS_DATA + - ao + - Modbus write (epicsUInt16)value + * - 6, 16, 23 + - 16-bit word + - 16-bit word + - MODBUS_DATA (or datatype-specific value) + - ao + - Modbus write value + * - Any + - NA + - NA + - POLL_DELAY + - ai, ao + - Read or write the delay time in seconds between polls for the read poller thread. + If <=0 then the poller thread does not run periodically, it only runs when it + is woken up by an epicsEvent signal, which happens when the driver has an asynInt32 + write with the MODBUS_READ drvUser string. + +asynInt32Array +~~~~~~~~~~~~~~ + +asynInt32Array device support is selected with + +:: + + field(DTYP,"asynInt32ArrayIn") + field(INP,"@asyn(portName,offset,timeout)drvUser") + + +or + +:: + + field(DTYP,"asynInt32ArrayOut") + field(INP,"@asyn(portName,offset,timeout)drvUser") + + +asynInt32Array device support is used to read or write arrays of up to +2000 coil values or up to 125 16-bit registers. It is also used to read +the histogram array of I/O times when histogramming is enabled. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Modbus function + - Offset type + - Data type + - drvUser + - Records supported + - Description + * - 1, 2 + - Bit + - Array of bits + - MODBUS_DATA + - waveform (input) + - value = (epicsInt32)Modbus data[] + * - 3, 4, 23 + - 16-bit word + - Array of 16, 32 or 64-bit words + - MODBUS_DATA (or datatype-specific value) + - waveform (input) + - value = (epicsInt32)Modbus data[] + * - 15 + - Bit + - Array of bits + - MODBUS_DATA + - waveform (output) + - Modbus write (epicsUInt16)value[] + * - 16, 23 + - 16-bit word + - Array of 16, 32, or 64-bit words + - MODBUS_DATA (or datatype-specific value) + - waveform (output) + - Modbus write value[] + * - Any + - 32-bit word + - NA + - READ_HISTOGRAM + - waveform (input) + - Returns a histogram array of the I/O times in milliseconds since histogramming was + last enabled. + * - Any + - 32-bit word + - NA + - HISTOGRAM_TIME_AXIS + - waveform (input) + - Returns the time axis of the histogram data. Each element is HISTOGRAM_BIN_TIME + msec. + +asynOctet +~~~~~~~~~ + +asynOctet device support is selected with + +:: + + field(DTYP,"asynOctetRead") + field(INP,"@asyn(portName,offset,timeout)drvUser[=number_of_characters]") + +or + +:: + + field(DTYP,"asynOctetWrite") + field(INP,"@asyn(portName,offset,timeout)drvUser[=number_of_characters]") + +asynOctet device support is used to read or write strings of up to 250 +characters. + +Note: The 0 terminating byte at the end of the string in a waveform +record or stringout record is only written to the Modbus device +if one of the ZSTRING_* drvUser types is used. + +Note: On input the number of characters read from the Modbus device will be the lesser of: + +- The number of characters in the record minus the terminating 0 byte + (39 for stringin, NELM-1 for waveform) or +- The number of characters specified after drvUser (minus the + terminating 0 byte) or +- The number of characters contained in the registers defined + modbusLength argument to drvModbusAsynConfigure (modbusLength or + modbusLength*2 depending on whether the drvUser field specifies 1 or 2 + characters per register. + +The string will be truncated if any of the characters read from Modbus +is a 0 byte, but there is no guarantee that the last character in the +string is followed by a 0 byte in the Modbus registers. Generally either +number_of_characters or NELM in the waveform record should be used to +define the correct length for the string. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Modbus function + - Offset type + - Data type + - drvUser + - Records supported + - Description + * - 3, 4, 23 + - 16-bit word + - String of characters + - STRING_HIGH, STRING_LOW, STRING_HIGH_LOW, or STRING_LOW_HIGH
+ ZSTRING_HIGH, ZSTRING_LOW, ZSTRING_HIGH_LOW, or ZSTRING_LOW_HIGH + - waveform (input) or stringin + - value = Modbus data[] + * - 16, 23 + - 16-bit word + - String of characters + - STRING_HIGH, STRING_LOW, STRING_HIGH_LOW, or STRING_LOW_HIGH
+ ZSTRING_HIGH, ZSTRING_LOW, ZSTRING_HIGH_LOW, or ZSTRING_LOW_HIGH + - waveform (output) or stringout + - Modbus write value[] + +Template files +~~~~~~~~~~~~~~ + +**modbus** provides example template files in the modbusApp/Db +directory. These include the following. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Files + - Description + - Macro arguments + * - bi_bit.template + - asynUInt32Digital support for bi record with discrete inputs or coils. Mask=1. + - P, R, PORT, OFFSET, ZNAM, ONAM, ZSV, OSV, SCAN + * - bo_bit.template + - asynUInt32Digital support for bo record with coil outputs. Mask=1. + - P, R, PORT, OFFSET, ZNAM, ONAM + * - bi_word.template + - asynUInt32Digital support for bi record with register inputs. + - P, R, PORT, OFFSET, MASK, ZNAM, ONAM, ZSV, OSV, SCAN + * - bo_word.template + - asynUInt32Digital support for bo record with register outputs. + - P, R, PORT, OFFSET, MASK, ZNAM, ONAM + * - mbbiDirect.template + - asynUInt32Digital support for mbbiDirect record with register inputs. + - P, R, PORT, OFFSET, MASK, SCAN + * - mbboDirect.template + - asynUInt32Digital support for mbboDirect record with register outputs. + - P, R, PORT, OFFSET, MASK + * - longin.template + - asynUInt32Digital support for longin record with register inputs. Mask=0xFFFF. + - P, R, PORT, OFFSET, SCAN + * - longout.template + - asynUInt32Digital support for longout record with register outputs. Mask=0xFFFF. + - P, R, PORT, OFFSET + * - longinInt32.template + - asynInt32 support for longin record with register inputs. + - P, R, PORT, OFFSET, SCAN, DATA_TYPE + * - longoutInt32.template + - asynInt32 support for longout record with register outputs. + - P, R, PORT, OFFSET, DATA_TYPE + * - ai.template + - asynInt32 support for ai record with LINEAR conversion + - P, R, PORT, OFFSET, BITS, EGUL, EGUF, PREC, SCAN + * - ao.template + - asynInt32 support for ao record with LINEAR conversion + - P, R, PORT, OFFSET, BITS, EGUL, EGUF, PREC + * - ai_average.template + - asynInt32Average support for ai record with LINEAR conversion. This support gets + callbacks each time the poll thread reads the analog input, and averages readings + until the record is processed. + - P, R, PORT, OFFSET, BITS, EGUL, EGUF, PREC, SCAN + * - intarray_in.template + - asynInt32Array support for waveform record with discrete, coil, or register inputs. + - P, R, PORT, OFFSET, NELM, SCAN + * - intarray_out.template + - asynInt32Array support for waveform record with discrete, coil, or register outputs. + - P, R, PORT, OFFSET, NELM + * - int64in.template + - asynInt64 support for int64in record with register inputs. + - P, R, PORT, OFFSET, SCAN, DATA_TYPE + * - int64out.template + - asynInt64 support for int64out record with register outputs. + - P, R, PORT, OFFSET, DATA_TYPE + * - aiFloat64.template + - asynFloat64 support for ai record + - P, R, PORT, OFFSET, LOPR, HOPR, PREC, SCAN, DATA_TYPE + * - aoFloat64.template + - asynFloat64 support for ao record + - P, R, PORT, OFFSET, LOPR, HOPR, PREC, DATA_TYPE + * - stringin.template + - asynOctet support for stringin record + - P, R, PORT, OFFSET, DATA_TYPE, SCAN + * - stringout.template + - asynOctet support for stringout record + - P, R, PORT, OFFSET, DATA_TYPE, INITIAL_READBACK + * - stringWaveformIn.template + - asynOctet input support for waveform record + - P, R, PORT, OFFSET, DATA_TYPE, NELM, SCAN + * - stringWaveformOut.template + - asynOctet output support for waveform record + - P, R, PORT, OFFSET, DATA_TYPE, NELM, INITIAL_READBACK + * - asynRecord.template + - Support for asyn record. Useful for controlling trace printing, and for debugging. + - P, R, PORT, ADDR, TMOD, IFACE + * - poll_delay.template + - Support for ao record to control the delay time for the poller thread. + - P, R, PORT + * - poll_trigger.template + - Support for bo record to trigger running the poller thread. + - P, R, PORT + * - statistics.template + - Support for bo, longin and waveform records to read I/O statistics for the port. + - P, R, PORT, SCAN + +The following table explains the macro parameters used in the preceding table. + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Macro + - Description + * - P + - Prefix for record name. Complete record name is $(P)$(R). + * - R + - Record name. Complete record name is $(P)$(R). + * - PORT + - Port name for **modbus** asyn port. + * - OFFSET + - Offset for Modbus data relative to start address for this port. + * - MASK + - Bit mask used to select data for this record. + * - ZNAM + - String for 0 value for bi/bo records. + * - ONAM + - String for 1 value for bi/bo records. + * - ZSV + - 0 severity for bi/bo records. + * - OSV + - 1 severity for bi/bo records. + * - BITS + - Number of bits for analog I/O devices. >0=unipolar, <0=bipolar. + * - DATA_TYPE + - drvUser field specifying the Modbus data type. If this field is blank or is MODBUS_DATA + then the default datatype specified in the drvModbusAsynConfigure command is used. + Other allowed values are listed in the table above (UINT16, INT16SM, BCD_SIGNED, + etc.) + * - EGUL + - Engineering value for lower limit of analog device. + * - EGUF + - Engineering value for upper limit of analog device. + * - LOPR + - Lower display limit of analog device. + * - HOPR + - Upper display limit of analog device. + * - PREC + - Number of digits of precision for ai/ao records. + * - NELM + - Number of elements in waveform records. + * - ADDR + - Address for asyn record, same as OFFSET above. + * - TMOD + - Transfer mode for asyn record. + * - IFACE + - asyn interface for asyn record. + * - SCAN + - Scan rate for record (e.g. "1 second", "I/O Intr", etc.). + * - INITIAL_READBACK + - Controls whether an initial readback from the device is done for the stringout or + string waveform output records. diff --git a/docs/source/driver_architecture.rst b/docs/source/driver_architecture.rst new file mode 100644 index 0000000..5772948 --- /dev/null +++ b/docs/source/driver_architecture.rst @@ -0,0 +1,177 @@ +Driver architecture +------------------- + +**CAUTION:** **modbus** can provide access to all of the I/O and memory +of the PLC. In fact, it is not even necessary to run a ladder logic +program in the PLC at all. The PLC can be used as a "dumb" I/O +subsystem, with all of the logic residing in the EPICS IOC. However, if +a ladder logic program *is* being run in the PLC then the EPICS access +with **modbus** must be designed carefully. For example, the EPICS IOC +might be allowed to *read* any of the PLC I/O points (X inputs, Y +outputs, etc.), but *writes* could be restricted to a small range of +Control Registers, (e.g. C200-C240). The ladder logic would monitor +these control registers, considering them to be "requests" from EPICS +that should be acted upon only if it is safe to do so. + +The architecture of the **modbus** module from the top-level down +consists of the following 4 layers: + +1. `EPICS asyn device support `__. + This is the general purpose device support provided with + `asyn `__ There is no + special device support needed or provided with **modbus**. +2. An EPICS asyn port driver that functions as a Modbus client. The + **modbus** port driver communicates with EPICS device support (layer + 1) using the standard asyn interfaces (asynUInt32Digital, asynInt32, + etc.). This driver sends and receives device-independent Modbus + frames via the standard asynOctet interface to the "interpose + interface" (layer 3). These frames are independent of the underlying + communications protocol. Prior to R3-0 this driver was written in C. + In R3-0 it was written as a C++ class that inherits from + asynPortDriver. This allows it to export its methods in a way that is + easy for other drivers to use, in particular the doModbusIO() method. +3. An asyn "interpose interface" layer that handles the additional data + required by the underlying communications layer (TCP, RTU, ASCII). + This layer communicates via the standard asynOctet interface to both + the overlying Modbus driver (layer 2) and to the underlying asyn + hardware port driver (layer 4). +4. An asyn port driver that handles the low-level communication (TCP/IP + or serial). This is one of the standard port drivers provided with + asyn, i.e. + `drvAsynIPPort `__ + or + `drvAsynSerialPort `__. + They are not part of the **modbus** module. + +Because **modbus** makes extensive use of existing asyn facilities, and +only needs to implement layers 2 and 3 above, the amount of code in +**modbus** is quite small (fewer than 3,900 lines). + +Each **modbus** port driver is assigned a single Modbus function code. +Usually a drivers is also assigned a single contiguous range of Modbus +memory, up to 2000 bits or 125 words. One typically creates several +**modbus** port drivers for a single PLC, each driver reading or writing +a different set of discrete inputs, coils, input registers or holding +registers. For example, one might create one port driver to read +discrete inputs X0-X37, a second to read control registers C0-C377, and +a third to write control registers C300-C377. In this case the asyn +address that is used by each record is relative to the starting address +for that driver. + +It is also possible to create a driver is allowed to address any +location in the 16-bit Modbus address space. Each read or write +operation is still limited to the 125/123 word limits. In this case the +asyn address that is used by each record is the absolute Modbus address. +This absolute addressing mode is enabled by passing -1 as the +modbusStartAddress when creating the driver. + +The restriction the modbus port driver to a single Modbus function does +not apply to the doModbusIO() method. This method can be used for +arbitrary Modbus IO using any function code. If absolute addressing is +enabled as described above then the doModbusIO() function can also +address any Modbus memory location. + +The behavior of the port driver differs for read function codes (1, 2, +3, 4), write function codes (5, 6, 15, 16), and read/write function +codes (23). + +Modbus read functions +~~~~~~~~~~~~~~~~~~~~~ + +For read function codes (when absolute addressing is not being used) the +driver spawns a poller thread. The poller thread reads the entire block +of Modbus memory assigned to this port in a single Modbus transaction. +The values are stored in a buffer in the driver. The delay between polls +is set when the port driver is created, and can be changed later at +run-time. The values are read by EPICS using the standard asyn +interfaces (asynUInt32Digital, asynInt32, asynInt64, asynFloat64, etc.) The values +that are read are the last stored values from the poller thread. The +means that EPICS read operations are *asynchronous*, i.e. they can +block. This is because although they do not directly result in Modbus +I/O, they do need to wait for a mutex that indicates that the poller +thread is done. + +For read functions it is possible to set the EPICS records to "I/O Intr" +scanning. If this is done then the port driver will call back device +support whenever there is new data for that input. This improves +efficiency, because such records only process when needed, they do not +need to be periodically scanned. + +The previous paragraphs describe the normal configuration for read +operations, where relative Modbus addressing is being used. If absolute +addressing is being used then the driver does not create a poller +thread, because it does not know what parts of the Modbus address space +should be polled. In this case read records cannot have SCAN=I/O Intr. +They must either be periodically scanned, or scanned by directly causing +the record to process, such as writing 1 to the .PROC field. Each time +the record processes it will result in a separate Modbus read operation. +NOTE: This is **much** less efficient than reading many registers at +once with relative Modbus addressing. For this reason absolute Modbus +addressing with read functions should normally be avoided. + +Modbus write functions +~~~~~~~~~~~~~~~~~~~~~~ + +For write function codes the driver does not itself create a separate +thread. Rather the driver does the Modbus I/O immediately in response to +the write operations on the standard asyn interfaces. This means that +EPICS write operations are also *asynchronous*, i.e. they block because +Modbus I/O is required. When the **modbus** driver is created it tells +asynManager that it can block, and asynManager creates a separate thread +that executes the write operations. + +Word write operations using the asynUInt32Digital interface (with a mask +parameter that is not 0x0 or 0xFFFF) are done using read/modify/write +operations. This allows multiple Modbus clients to write and read single +words in the same block of Modbus memory. However, it *does not* +guarantee correct operation if multiple Modbus clients (or the PLC +itself) can modify bits within a single word. This is because the Modbus +server cannot perform the read/modify/write I/O as an atomic operation +at the level of the Modbus client. + +For write operations it is possible to specify that a single read +operation should be done when the port driver is created. This is +normally used so that EPICS obtains the current value of an output +device when the IOC is initialized. + +Modbus RTU specifies a minimum delay of 3.5 character times between +writes to the device. The modbusInterposeConfig function allows one to +specify a write delay in msec before each write. + +Modbus write/read functions +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Modbus function code 23 allows for writing a set of registers and +reading a set of registers in a single operation. The read operation is +performed after the write operation, and the register range to be read +can be different from the register range to be written. Function code 23 +is not widely used, and the write/read operation is not a good fit to +the **modbus** driver model of read-only and write-only drivers. +Function code 23 is implemented in **modbus** with the following +restrictions: + +- A driver that uses Modbus function code 23 is either *read-only* or + *write-only*. +- A read-only driver is created by specifying function code 123 to the + drvModbusAsynConfigure command described below. The driver will use + Modbus function code 23 for the Modbus protocol. It will only read + registers (like function codes 3 and 4), it will not write any data + to the device. +- A write-only driver is created by specifying function code 223 to the + drvModbusAsynConfigure command described below. The driver will use + Modbus function code 23 for the Modbus protocol. It will only write + registers (like function code 16), it will not read any data from the + device. + +Platform independence +~~~~~~~~~~~~~~~~~~~~~ + +**modbus** should run on all EPICS platforms. It has been tested on +linux-x86, linux-x86_64, vxWorks-ppc32, win32-x86, windows-x64, (native +Windows with Microsoft Visual Studio C++ compiler). + +The only thing that may be architecture dependent in **modbus** is the +structure packing in modbus.h. The "#pragma pack(1)" directive used +there is supported on gnu and Microsoft compilers. If this directive is +not supported on some compilers of interest then modbus.h will need to +have the appropriate architecture dependent code added. diff --git a/docs/source/example_applications.rst b/docs/source/example_applications.rst new file mode 100644 index 0000000..5d0f91b --- /dev/null +++ b/docs/source/example_applications.rst @@ -0,0 +1,210 @@ +Example Applications +-------------------- + +**modbus** builds an example application called modbusApp. This +application can be run to control any number of Modbus PLCs. + +In the iocBoot/iocTest directory there are several startup scripts for +EPICS IOCs. These are designed to test most of the features of the +**modbus** driver on Koyo PLCs, such as the DL series from Automation +Direct. + +- Koyo1.cmd creates **modbus** port drivers to read the X inputs, write + to the Y outputs, and read and write from the C control registers. + Each of these sets of inputs and outputs is accessed both as coils + and as registers (V memory). bi/bo, mbbiDirect/mbboDirect, and + waveform records are loaded to read and write using these drivers. + +- Koyo2.cmd creates **modbus** port drivers to read the X inputs, write + to the Y outputs, and read and write from the C control registers. + Only coil access is used. This example also reads a 4-channel 13-bit + bipolar A/D converter. This has been tested using both signed-BCD and + sign plus magnitude binary formats. Note that a ladder logic program + must be loaded that does the appropriate conversion of the A/D values + into V memory. + +- st.cmd is a simple example startup script to be run on non-vxWorks + IOCs. It just loads Koyo1.cmd and Koyo2.cmd. It is invoked using a + command like: + + :: + + ../../bin/linux-x86/modbusApp st.cmd + + + One can also load Koyo1.cmd or Koyo2.cmd separately as in: + + :: + + ../../bin/linux-x86/modbusApp Koyo1.cmd + + + st.cmd.vxWorks is a simple example startup script to be run on + vxWorks IOCs. It just loads Koyo1.cmd and Koyo2.cmd. + +The following is the beginning of Koyo1.cmd when it is configured for +serial RTU with slave address 1 on /dev/ttyS1. It also shows how to +configure TCP and serial ASCII connections. (Koyo PLCs do not support +ASCII however). + +:: + + # Koyo1.cmd + + < envPaths + + dbLoadDatabase("../../dbd/modbusApp.dbd") + modbusApp_registerRecordDeviceDriver(pdbbase) + + # Use the following commands for TCP/IP + #drvAsynIPPortConfigure(const char *portName, + # const char *hostInfo, + # unsigned int priority, + # int noAutoConnect, + # int noProcessEos); + drvAsynIPPortConfigure("Koyo1","164.54.160.158:502",0,0,0) + asynSetOption("Koyo1",0, "disconnectOnReadTimeout", "Y") + m#modbusInterposeConfig(const char *portName, + # modbusLinkType linkType, + # int timeoutMsec, + # int writeDelayMsec) + modbusInterposeConfig("Koyo1",0,5000,0) + + # Use the following commands for serial RTU or ASCII + #drvAsynSerialPortConfigure(const char *portName, + # const char *ttyName, + # unsigned int priority, + # int noAutoConnect, + # int noProcessEos); + #drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0) + #asynSetOption("Koyo1",0,"baud","38400") + #asynSetOption("Koyo1",0,"parity","none") + #asynSetOption("Koyo1",0,"bits","8") + #asynSetOption("Koyo1",0,"stop","1") + + # Use the following command for serial RTU + # Note: non-zero write delay (last parameter) may be needed. + #modbusInterposeConfig("Koyo1",1,1000,0) + + # Use the following commands for serial ASCII + #asynOctetSetOutputEos("Koyo1",0,"\r\n") + #asynOctetSetInputEos("Koyo1",0,"\r\n") + # Note: non-zero write delay (last parameter) may be needed. + #modbusInterposeConfig("Koyo1",2,1000,0) + + # NOTE: We use octal numbers for the start address and length (leading zeros) + # to be consistent with the PLC nomenclature. This is optional, decimal + # numbers (no leading zero) or hex numbers can also be used. + # In these examples we are using slave address 0 (number after "Koyo1"). + + # The DL205 has bit access to the Xn inputs at Modbus offset 4000 (octal) + # Read 32 bits (X0-X37). Function code=2. + drvModbusAsynConfigure("K1_Xn_Bit", "Koyo1", 0, 2, 04000, 040, 0, 100, "Koyo") + + # The DL205 has word access to the Xn inputs at Modbus offset 40400 (octal) + # Read 8 words (128 bits). Function code=3. + drvModbusAsynConfigure("K1_Xn_Word", "Koyo1", 0, 3, 040400, 010, 0, 100, "Koyo") + + # The DL205 has bit access to the Yn outputs at Modbus offset 4000 (octal) + # Read 32 bits (Y0-Y37). Function code=1. + drvModbusAsynConfigure("K1_Yn_In_Bit", "Koyo1", 0, 1, 04000, 040, 0, 100, "Koyo") + + # The DL205 has bit access to the Yn outputs at Modbus offset 4000 (octal) + # Write 32 bits (Y0-Y37). Function code=5. + drvModbusAsynConfigure("K1_Yn_Out_Bit", "Koyo1", 0, 5, 04000, 040, 0, 1, "Koyo") + + # The DL205 has word access to the Yn outputs at Modbus offset 40500 (octal) + # Read 8 words (128 bits). Function code=3. + drvModbusAsynConfigure("K1_Yn_In_Word", "Koyo1", 0, 3, 040500, 010, 0, 100, "Koyo") + + # Write 8 words (128 bits). Function code=6. + drvModbusAsynConfigure("K1_Yn_Out_Word", "Koyo1", 0, 6, 040500, 010, 0, 100, "Koyo") + + # The DL205 has bit access to the Cn bits at Modbus offset 6000 (octal) + # Access 256 bits (C0-C377) as inputs. Function code=1. + drvModbusAsynConfigure("K1_Cn_In_Bit", "Koyo1", 0, 1, 06000, 0400, 0, 100, "Koyo") + + # Access the same 256 bits (C0-C377) as outputs. Function code=5. + drvModbusAsynConfigure("K1_Cn_Out_Bit", "Koyo1", 0, 5, 06000, 0400, 0, 1, "Koyo") + + # Access the same 256 bits (C0-C377) as array outputs. Function code=15. + drvModbusAsynConfigure("K1_Cn_Out_Bit_Array", "Koyo1", 0, 15, 06000, 0400, 0, 1, "Koyo") + + # The DL205 has word access to the Cn bits at Modbus offset 40600 (octal) + # We use the first 16 words (C0-C377) as inputs (256 bits). Function code=3. + drvModbusAsynConfigure("K1_Cn_In_Word", "Koyo1", 0, 3, 040600, 020, 0, 100, "Koyo") + + # We access the same 16 words (C0-C377) as outputs (256 bits). Function code=6. + drvModbusAsynConfigure("K1_Cn_Out_Word", "Koyo1", 0, 6, 040600, 020, 0, 1, "Koyo") + + # We access the same 16 words (C0-C377) as array outputs (256 bits). Function code=16. + drvModbusAsynConfigure("K1_Cn_Out_Word_Array", "Koyo1", 0, 16, 040600, 020, 0, 1, "Koyo") + + # Enable ASYN_TRACEIO_HEX on octet server + asynSetTraceIOMask("Koyo1",0,4) + # Enable ASYN_TRACE_ERROR and ASYN_TRACEIO_DRIVER on octet server + #asynSetTraceMask("Koyo1",0,9) + + # Enable ASYN_TRACEIO_HEX on modbus server + asynSetTraceIOMask("K1_Yn_In_Bit",0,4) + # Enable all debugging on modbus server + #asynSetTraceMask("K1_Yn_In_Bit",0,255) + # Dump up to 512 bytes in asynTrace + asynSetTraceIOTruncateSize("K1_Yn_In_Bit",0,512) + + dbLoadTemplate("Koyo1.substitutions") + + iocInit + + +Note that this example is designed for testing and demonstration +purposes, not as a realistic example of how **modbus** would normally be +used. For example, it loads 6 drivers to access the C control relays +using function codes 1 (read coils), 3 (read holding registers), 5 +(write single coil), 6 (write single holding register), 15 (write +multiple coils), and 16 (write multiple holding registers). This allows +for testing of all function codes and record types, including waveforms. +In practice one would normally only load at most 2 drivers for the C +control relays, for example function code 1 (read coils), and function +code 5 (write single coil). + +testDataTypes.cmd and testDataTypes.substitutions are used for testing the +different Modbus data types. +The files ModbusF1_A0_128bits.mbs, ModbusF3_A200_80words.mbs, ModbusF3_A200_80words.mbs, +and ModbusF3_A300_80words.mbs are configuration files for +the `Modbus Slave `__ +program, which is an inexpensive Modbus slave emulator. +This test writes and reads each of the supported Modbus numerical data types as follows: + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - asyn interface + - Output record + - Input record + - Modbus start address + - Slave simulator file + * - asynInt32 + - longout + - longin + - 100 + - ModbusF3_A100_80words.mbs + * - asynInt64 + - int64out + - int64in + - 200 + - ModbusF3_A200_80words.mbs + * - asynFloat64 + - ao + - ai + - 300 + - ModbusF3_A300_80words.mbs + + +There is another test application called testClient.cpp which +demonstrates how to instantiate a drvModbusAsyn object and use it to +perform Modbus I/O to an external device. This example is a pure C++ +application running without an IOC. The same code could be used in a +driver in an IOC. diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..5541929 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,21 @@ +modbus +====== + +:author: Mark Rivers, University of Chicago + +This is an EPICS module for communicating with Modbus devices using asyn device support. + +Table of Contents +----------------- + +.. toctree:: + :maxdepth: 3 + + acknowledgments + overview + driver_architecture + creating_driver + device_support + example_applications + medm_screens + debugging diff --git a/docs/source/medm_screens.rst b/docs/source/medm_screens.rst new file mode 100644 index 0000000..6fc82cc --- /dev/null +++ b/docs/source/medm_screens.rst @@ -0,0 +1,91 @@ +medm screens +------------ + +**modbus** provides example medm .adl files in the modbusApp/op/adl +directory. + +modbusDataTypes.adl +~~~~~~~~~~~~~~~~~~~ +The following is a screen shot from an IOC running the testDataTypes.cmd +and testDataTypes.substitutions files, communicating with a Modbus Slave Simulator. +These are the ao/ai records using the asynFloat64 interface. +It shows that the output and input (readback) records agree. + +.. figure:: testDataTypes.png + :align: center + +The following is a screen shot from the Modbus Slave Simulator communicating +with the ao/ai records shown above. The values shown in this screen agree +with this in the medm screen, showing that each Modbus data type is being communicated correctly. + +.. figure:: testDataTypesSimulator.png + :align: center + +The following are screen shots of these screens from an IOC +controlling a Koyo DL205 PLC. + +Koyo1.adl +~~~~~~~~~ +Top level medm screen for the Koyo1 example application. + +.. figure:: Koyo1.png + :align: center + +Koyo_8inputs.adl +~~~~~~~~~~~~~~~~ +Inputs X0-X7 read as discrete inputs (function code 1). + +.. figure:: K1_Xn_Bit.png + :align: center + +Inputs C200-C207 read as register inputs (function code 6). + +.. figure:: K1_C20n_In_Word.png + :align: center + +Koyo_8outputs.adl +~~~~~~~~~~~~~~~~~ +Outputs Y0-Y7 written using register access (function code 6). + +.. figure:: K1_Yn_Out_Word.png + :align: center + +Outputs Outputs C200-C207 written using bit access (function code 5). + +.. figure:: K1_C20n_Out_Bit.png + :align: center + +modbusArray.adl +~~~~~~~~~~~~~~~ +Inputs C0-C377 read using a waveform record and coil access (function code 1). + +.. figure:: K1_Cn_In_Bit_Array.png + :align: center + +Inputs C0-C377 read using a waveform record and register access (function code 3). + +.. figure:: K1_Cn_In_Word_Array.png + :align: center + +modbusStatistics.adl +~~~~~~~~~~~~~~~~~~~~ +I/O statistics for the Modbus driver that is reading inputs X0-X37 using register access (function code 3). +The histogram is the number of events versus TCP/IP write/read cycle time in msec. + +.. figure:: K1_Xn_Bit_Statistics.png + :align: center + +Koyo2.adl +~~~~~~~~~ +Top level medm screen for the Koyo2 example application. + +.. figure:: Koyo2.png + :align: center + +Koyo_4ADC.adl +~~~~~~~~~~~~~ +4 ADC inputs from a 13-bit bipolar ADC. + +.. figure:: K2_ADCs.png + :align: center + diff --git a/docs/source/overview.rst b/docs/source/overview.rst new file mode 100644 index 0000000..1e62bfc --- /dev/null +++ b/docs/source/overview.rst @@ -0,0 +1,248 @@ +Overview of Modbus +------------------ + +MODBUS is an application layer messaging protocol, positioned at level 7 +of the OSI model, that provides client/server communication between +devices connected on different types of buses or networks. It is +typically used for communication with I/O systems, including +Programmable Logic Controllers (PLCs). + +Modbus communication links +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Modbus supports the following 3 communication-link layers: + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Link type + - Description + * - TCP + - TCP/IP using standard port 502. + * - RTU + - RTU is normally run over serial communication links, i.e. RS-232, + RS-422, or RS-485. RTU uses an additional CRC for packet checking. The + protocol directly transmits each byte as 8 data bits, so uses "binary" + rather than ASCII encoding. When using serial links start and end of + message frames is detected by timing rather than by specific characters. + RTU can also be run over TCP, though this is less common than the + standard Modbus TCP without RTU. + * - Serial ASCII + - Serial protocol, which is normally run over serial communication links, + i.e. RS-232, RS-422, or RS-485. Serial ASCII uses an additional LRC for + packet checking. The protocol encodes each byte as 2 ASCII characters. + The start and end of message frames is detected by specific characters + (":" to start a message and CR/LF to end a message). This protocol is + less efficient than RTU, but may be more reliable in some environments. + ASCII can also be run over TCP, though this is much less common than the + standard Modbus TCP. + +This **modbus** package supports all of the above Modbus +communication-link layers. + +Modbus data types +~~~~~~~~~~~~~~~~~ + +Modbus provides access to the following 4 types of data: + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Primary tables + - Object type + - Access + - Comments + * - Discrete Inputs + - Single bit + - Read-Only + - This type of data can be provided by an I/O system. + * - Coils + - Single bit + - Read-Write + - This type of data can be alterable by an application program. + * - Input Registers + - 16-bit word + - Read-Only + - This type of data can be provided by an I/O system. + * - Holding Registers + - 16-bit word + - Read-Write + - This type of data can be alterable by an application program. + +Modbus communications +~~~~~~~~~~~~~~~~~~~~~ + +Modbus communication consists of a *request message* sent from the +*Modbus client* to the *Modbus server*. The server replies with a +*response message*. Modbus request messages contain: + +- An 8-bit Modbus function code that describes the type of data + transfer to be performed. +- A 16-bit Modbus address that describes the location in the server to + read or write data from. +- For write operations, the data to be transferred. + +Modbus function codes +~~~~~~~~~~~~~~~~~~~~~ + +**modbus** supports the following 9 Modbus function codes: + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - Access + - Function description + - Function code + * - Bit access + - Read Coils + - 1 + * - Bit access + - Read Discrete Inputs + - 2 + * - Bit access + - Write Single Coil + - 5 + * - Bit access + - Write Multiple Coils + - 15 + * - 16-bit word access + - Read Input Registers + - 4 + * - 16-bit word access + - Read Holding Registers + - 3 + * - 16-bit word access + - Write Single Register + - 6 + * - 16-bit word access + - Write Multiple Registers + - 16 + * - 16-bit word access + - Read/Write Multiple Registers + - 23 + + +Modbus addresses +~~~~~~~~~~~~~~~~ + +Modbus addresses are specified by a 16-bit integer address. The location +of inputs and outputs within the 16-bit address space is not defined by +the Modbus protocol, it is vendor-specific. The following table lists +some of the commonly used Modbus addresses for Koyo DL05/06/240/250/260/430/440/450 PLCs. + +Discrete inputs and coils +_________________________ + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - PLC Memory Type + - Modbus start address Decimal (octal) + - Function codes + * - Inputs (X) + - 2048 (04000) + - 2 + * - Special Relays (SP) + - 3072 (06000) + - 2 + * - Outputs (Y) + - 2048 (04000) + - 1, 5, 15 + * - Control Relays (C) + - 3072 (06000) + - 1, 5, 15 + * - Timer Contacts (T) + - 6144 (014000) + - 1, 5, 15 + * - Counter Contacts (CT) + - 6400 (014400) + - 1, 5, 15 + * - Stage Status Bits (S) + - 6144 (012000) + - 1, 5, 15 + +Input registers and holding registers (V memory) +________________________________________________ + +.. cssclass:: table-bordered table-striped table-hover +.. list-table:: + :header-rows: 1 + :widths: auto + + * - PLC Memory Type + - Modbus start address Decimal (octal) + - Function codes + * - Timer Current Values (TA) + - 0 (00) + - 4 + * - Counter Current Values (CTA) + - 512 (01000) + - 4 + * - Global Inputs (VGX) + - 16384 (040000) + - 4 + * - Global Outputs (VGY) + - 16512 (040200) + - 3, 6, 16 + * - Inputs (VX) + - 16640 (040400) + - 4 + * - Outputs (VY) + - 16704 (040500) + - 3, 6, 16 + * - Control Relays (VC) + - 16768 (040600) + - 3, 6, 16 + * - Stage Status Bits (VS) + - 16896 (041000) + - 3, 6, 16 + * - Timer Contacts (VT) + - 16960 (041100) + - 3, 6, 16 + * - Counter Contacts (VCT) + - 16992 (041140) + - 3, 6, 16 + * - Special Relays (VSP) + - 17024 (041200) + - 4 + +Other PLC manufacturers will use different Modbus addresses. + +Note that 16-bit Modbus addresses are commonly specified with an offset +of 400001 (or 300001). This offset is not used by the **modbus** driver, +it uses only the 16-bit address, not the offset. + +Modbus data length limitations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Modbus read operations are limited to transferring 125 16-bit words or +2000 bits. Modbus write operations are limited to transferring 123 +16-bit words or 1968 bits. + +More information on Modbus +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For more information about the Modbus protocol, the official Modbus +specification can be found `on the +Web `__ +or in the **modbus** documentation directory. +:download:`Modbus_Application_Protocol_V1_1b.pdf`. + +The official specification for Modbus over TCP/IP can be found `on the +Web `__ +or in the **modbus** documentation directory. +:download:`Modbus_Messaging_Implementation_Guide_V1_0b.pdf`. + +The official specification for Modbus over serial can be found `on the +Web t3QfhedbK_Eni077PwnYgf0s;v`qCkjDNi9N{BMC`_03n1BGQqn-)ou5^ckg?DxZmgb@O;W~Bx_w+ z*Ze#G|MOZmj(K^mU2U@Zop;_@`|UShfB()q?{VLG=lz?jJ_Np*`+K0yHLow% z)?5zXzW4d*>z{ua{wVdUJLYLA&wioYkXk%hcevtq+H=2{g0n|=wRi0o{R$b}mEC14 zQ8x0FDs5kNUrb=4G|_@6UE_!dkRd=_U9_87r6g!5R$yaq~)1S2C?nBb$!zC~Esd!H$O(#xBnWF247#Jm_Nzpe` z!B9ivcrr6yrG_olvPa+=1n!d3jHfE11ViRMAeW^v^D5duH5z5v|h_>HwT%hD4tv#WI9-+T0N+RtTNJ3L>?c4e(_NPB+8V z)x+yFHH-!B3|3~h#B6{sbYcf)46rW@U}3L2;rDjjPJZ0d(h?!0)}F|4!ztr%aSauz ze+eZm=Q3zZx4f})In*ULhFCd8pB|!LQYzrfiU!{7c5KTGh|UMa!k2{brNc*Y6M5K) znI?`bHd+S{$da-4vArrFEXN z)XPXvwr!7`a$lB1aLRP-GrK|EFj0eoe}uRpk?KaJu9tBJ?2`Tx-0AwbQX$M9+waz> z>TAdtY?p`iZK}6hz9>?GXKrDqUW7ClHXVO1tZn`%-|I5%Jl-UdU4+KPzHaCj zzMzMn5TH(ZPRobChW2ks4A{bjs7oN~$wG;prpj*U+oLREO46tpGdhEUC{b{Xhfa-8i$}HH0erM?iyTu>k@Jj5cc$&U&WVAse#w~Gp zIuK)?H>hJn=0_SRnn-uLM$6O0#WMK3#UDl>iz&+w2b8W~i7VFM$Ky6`s87dv%?=X3 zZroVqjdPI|9P*gTG{n4A5tC16mJ%%QC_epb$#HXTht{dWvv^@{kQm$eUI@FVc&80f z?)M23@Dt`%4_1Q8xO>c1W|5zzFv$TA0a(X ziwYWpRYh#<9U4p`!pvNv-t~c!=%+M#cnnn@0ND_Bipud))tH8Arhn{tA-bNbjTBS zY$I3N+@&a3ZjGNWBYbou@gtdrTJyrK(eja%c%iQlAM+h;E+WVRWr0UL_>_YvccIrL z%8MkbzQSg6c>aFnN4U*>-gd61bc&iXgl>j#*`2}_UDUn2$8rXj`bB<@jVoR_FL}KR zo5HWGzXM{)K$r5)9CV^Y)eb#dx=r?i;pC1uIq0}lp`M5W?#y=7`$tYkZuO4F#OxT8jCvC2D+LB>dLi!Eau zp9N{ za3F$z)(Pg$@|NFt2~EOCGEU3FB`H%F!hl#=`o}Wd*}q=V5pkn-1G-E*4X^z$QKoO*b*<=`JNZj1uBJ=CvzL4CDNaWah7gF|(rk=Y z{l)jRzN>AI*B?ImYROt2XJNyYtfhX7Axt+nse1+^P2|l;=rfYo<#w)a zW`ws?2CvdoQkIe%mX%7~ZzHAjX~*d$K4dX27N=fDOJ^85ncWDc(+U!&6!H{y(xpY7 zR?r=k{qRmc*5RsbcE^YCO3xzPAibYQADn^K+&Ly?LpYSS`x6a`HE-~vacXt>DzOop zMsnKttfc>r2DXJOL+p@I_AkMK1-!uNcH_CPAq=efXbrMoiH^Ipg*WL;Ntf!8AeFQcd{Yv@k-9lG`E*lFN1Vu^OCQe z=;+MriCWhg&*Q2v?a{p~a&(}1r_!1wDa6(A7KVdJTvtS$_+G-gh3hn*Od@v9b%9}h z%z{P)5KLDRCl zcqA4#sloDQ_7PQG;ROPcQM{tmPz85tj6gOego)n9uP8gC{-ZF`$ICV2b)(ZE% z$509AXGqVl#7lecFdax|cyFQMl_Sv8C?sZL)13PC-th{5AKwGu6!V}X@y&etowXWB ze`6{}0>3BTe7&Zu(DMJO%O5xJ)zfvnQB~C1KLEX+?^Be2W7fc}wciT?!hZ|+A09XK zgGHYFhB0QgbX`11i+w8)7(N30768+H*SiuIyt(UiiTMiGE9Yv3@>xfNw{D>ttdqW* zjz~u^9@PIastAAn{ub_bqu(OqQy62kSaQ*;XhUDB@;BhOEnMu0n71G8g?ayd0~@lV z^>|a`B^6lPedVoNX0Eg(KIRYd2P4b=@b|;-Z&v`FawvIz`{-C?Jh=!V{zru$H_ZdB zz^vh&9Cj5_TRs&e0<1lC1TNC zk6YYcjHts+o12@*y40&bGp`kxrhy#A(5(XQ6hb;s9LzZ-*i3_>!VLE{6i5fr)$)_t zjbdbbjUAF6gj&`#Az~99s)0Wlg~h85MHO#ZV_Gd(+OYa{p&zeedX*c8uH#Y zLz(w26c01**43sFF%B$EX`{6S4P$&z4ECnP6pMe5B$>t30tM0i?dN}s{G=qMD)@}| zaVufy%<2&Bpe|zB4Es_QUL?JVX*GAE44x3(#38Wmc?cI?m|dMOT&i^Wpor3k$BUh_Fohi zTfCj_E2jDCyO-j2R`z-!zYPreTsV(zVTdYX%5Ds11PBJmnPFw-kgRa@pVcsnw+B_3rt1k z!WZD51cz>0u+7+oWunwhKVc}nZG2<4MXsruzdoC>v6JxZREKMoGh7sl94k?@PiPy9 z+s4-n4TfdfQutN3t-$5M&A~QAq|Ca(j?rP?{1dMA%u#KQF8c^}VV@nIM%T$#eZn1x z87%__bmU3DOTF)~Q4Nlp+{zWl`f8?TQ$r(C?DOW%g~MTT+IhBpnopvIj5eCa6LN=5 zxlZA%4PGR4t2Mk4BZtz?=l7Y&&J)6jy@b_0^*-gzt&rzrQF*-47ES)x2Fk)vH;LL7 zp~OxjlvU&+poTH%7G>rOb>s&Le)6$l71C{6C$}!mCtu`Kxq2uK(&6UnIDO{4GSG6- zhmDb+bbiluKQ1rw8fT$gcRBHU0wN>Yw{rCf`thR#%+z7}1}oN_ll0tX3ud%Ap0Z4z zLX0Ce15@D=GH~?=ypPGtA8s%_7ii`7GbqDUl_MNZ1%_UVYC zZIN4`#cXp|Mn^+Iwcszs@>rNG8jNSIA^G|7Q`8-f1rYx3UvwA1olquJIdd`=DzeBgymg#4HBOR8NOT{l61M~r;ucCaa)ir_NTx>6%3HmS8(5W> zW^R*9B=O{xRR+6o3=EZ{iv$suWyj91B~?DmF>rF8r(M@t2c6-kbj!fzNK(G2^G8%F zq%&K9E_ZNEa&Q-P&morFV~K>@+XZ12U7ep+AsaKw1+mZbx++pdit%m3N%1zb;p#PTbK}0;I@Qrq1`%O854SDwJjvbx-^d%bu z!Mxn1#4jpTwk`A=cC;tFG16rdR4_vdMXp zm>VlqvbD&_yKsm?<9)Z+yrZN*cIP`rp~pI18k`BrK%u~RPgt8ZoYw3sGdk*Q9g!up z7iR=NDP)Eca#X{dG)APCtR+^(e86|kW%UyFROqMOK^O9+??O~lt6lA!F0AO*w_bQhtdKb&YEmuzXy zb!#I|(>mM=OX5dKvxMrFeUa(1j#D7h>7CR$*CC-~_G$Hxbpf1sob>V~Sm6o%KFU=VO27 z%vCFra~1z04C%T~W($#%7rSW9l!ZdESwXc+sYkR>7u8rm5uAew9>P57e3Q@sW&;dO zX0doj0zJ40lfW;GjDcI<2@uw1m9p{w$bpw4Y`?Spy^%Y)bL1 zytR|4I)pMETA)uR)E5T;yEf3S4Ti}T1s&+5tI>wTP{VH)C+f+m46rBal9c3_7;*)PpaQWJCf*2yPDs| z#mDmh2A@O=+U{-#v&-!Cq(`On$_Z;5*xps32+xjNHzSFzNP^2uSo&jl7-%}fQrNpFeni| zMu^4-h-TRLTIyh$A89KSs#{?;|CsJrhEY`)KJQbVmsGS-V&EhVB_1Sx)chct_jzom zxKTQ)6mrOtfAKrqGS*vM<&D`xmVV(kje63J@#n$fxQUYOqkXD+j5HlCp)a`MF)BMn zqq3r>W>(o0q?rp9(_-iY2_zX}ggd!pC>-fQ^Ll7gC^vm8N#_a?n4d3_3_lc%K?wm* zF58yq(y}i(TFHZtMi_AjFVa~wGuwz-^vt9m+ILaEqNVUb^443^eKY(gP@5rJu5~e5 zY$BGYB7g1<6xi5; zT0&)znoi~~e4cg#HSH_@cxXCq3m$D$+U#P>4JxYZ2$?a0qtB6?ft}YL_!5kg`z5Y7 zKM-Qlljd!s+2>^}oh2-944M9}cF@Dfb#qVS!&67{+e#nlVPAS+^t0{LztQ9=*7zF6 zI;b{x>Lu(@)JPLSnLaaqZSHRfHV50F*izDtXNj0|O ze$5WVWpRxixkg#Ul^J%IqN}R4{BuLyo$=;kFxrM5Zp?{yn2A0){MdJKWfVo&i61w( zode?=nqnF=#FcZe`fU}dB5e|!r=c~>Ts<+ity2)tkcD1Gcgfo;2mDa`C@r9%w*Bjd zgty1i@a26Qtni-ktW4(;KVymr7}h5TjIg3{WDNw_>?ANQyvr z>BRlv<+R(}F(bPWla%SXt|+FbuOu~_W!WfbBOEVJhoY>HCYDXDhM?xCgG8q@q!_y! z7b6Ef%<;f%5=6{cd&}!;^oi(C?2cUME z#pm2%2S%IuQ$s$O-sYC*y<|f(Fi-p#7bNeGshI>tY(knrBj|}F&$W^?rsxmyw zkx(+NblL$ZPkl^bAbDhA!{sX8Xh4rUr&d4>hnV;`&{ah5syhLXgU7vv z3H^V{LZ9;drZj8&{s1Vy|BYnsJ4HHV_DK=G1@U70WM|_Yb-kv(0eJM%msg~^G4JUl znD^TA-2RmYN)Q;|z-xI8RliglmI$!B_16J9)EB+)Z|UP&mg9!FO*nOizR7J1zvi7{ zNkfxaF67bzE{gU0~=}v4;H}~ic>xqp_+#EffLq{)EvG#`iBC$ zeZau%6TV-o{?#|XwPs0J8va?mk>xJj=1t<_a=^nkJm=O}R(!H6HYkJ}8B}uIf`%pY z?nAuH^d$`P)w_>F9eN$k?ASumorT@~v9_RYXRh)l3T3y?mZ|tgd&rzQVbErekx8G; zSduN=)yJ^eMY648L4IK(n*uW<$Jd%cq&^{Ri|(~SGb3A3*u`p7J_2)!xvr8VVMpWV zq9}8>BlkPTgA^h302xnC_nxY^B)*S!{sqbMf54kExv(}6@?S3}^A?LS-{|!0&}rza zIMZ;@=Ih`ZDMn`PnG!>5H)N+errG1QMo2T~>MyqJ>Woje#~Lp6@e^Vq9n4(G%HLgqUpaAT}#M zx;)w`P6Vp6Q5m&4VUXuYTPtVV?|BzT^=8C^kY=1SW?GbidIQ%F7M$j@upXNuex5(+ zT-9r?4c%d-uD*G}^gyE)gX|8d42QO%Vt?<@Pc>df40ylpw4SGOakV!JV z(k&8F=hhn%Lxe`P-$R5=JCD3OJl!BzU&;YDLnonuSD)TP+{BPQ*2!)W#a(TICUs6?N;jhKN=}I6g2Z=d|`8EyK^cx+B$r+e@Z0E@647@yNkFB& z1z8?o?c}j_WDaZ?f>Z@JP*!XyO zpS?OI+IO;akYxgLSAOL#W9u)rD71;sB3Fhp+hLiZxz6o7y@;l2 z{qJ#TYj?>mqFmZt`tvUw`KMkC{{8ch#*;bqsG|gTaU39I>3fTCgdtcj)!KS9Lr2De zg@M4b2fpNujsL2z7Rpwa<YSH6WAr0{R?{47j5RWlcpGN@UFk;4~Ag?l2q z_~*j+`;K;mnRAVDFFC;Tsm|W!26#Uq6!Sn^Mexi3=4f*)@Q_z|X8elrspu$MT?A$P zeUKH-D8jie;5bb|Ah zAF-@0qmwfEs$2Yj6;+DP1Nvs?0r{bjw((9;V?dUV_YGl(ujB?a&@xz$5%(SkZQyPm z9N-8R9}Z`y&aj1kNHa(H$mwdzcKIr+6n9i?JZoanEJ)byXAa7X8vXltx+RF*R@FKI zGOulEzr&N==n=z!u5iM1cl()#7Ka@IvE5Fkol}FM{CUtipl=#yL%FAOvgN*lkiKBL zhkP6jNQl=+=O6K(rjaUbkm|G)eVyWf!RnlcW$o~SqxR*pZnNs!^R@yr#N7{^9&=&z zo31oh{%-I7G@{ryBzXRI;t|N?XLp7N!rYKCfi4In<|^OCgi`-=z}T$-{;5x#qa{z9 zt6H2LIW%r1GiLdP;QeH}xy_kmsO~#+nk7tih+s-;1E%FVd5kH4zJa!n4UB$`ulDxt zKJ?ija|62&Q_Azm*tNl#Mp+Bss+B8af4?$IqMYxp342=b3<@rvEyD)fkR0A?60p4X zQo6+LAgZ^^Y?uAFg|v)zE33U(Lj0^Pel|R3Uw9TXUp93D#v`qFXQD6dA;+|27TOw) z-h?KNJldD%BoBqlpBit;b<%k_(=0-|VCe7K=G69V0~H9%e&F0HH!+1KojHRtZyT4k z_&*@djTWrkK)_F$K7GKy5(A77S;AgiTL{5$4yq-bK&6TuoXCsK%_49{J1<3`_6Pp> zbRE_G4wW2Xs=R(2ma-m_yuOJ=(4->V9%WS~{mpmDo@VDO}nL!J5JRK35xi0<%bMf9vIQo|)T~dq3*uxsy1NZ*$>_LM3HEj8&yxVf9Dqdh z{}2+ZjfL5Ha{FIQNv7-~RmYwq*gqm4%%NoGA0aV6CY#9hsqkD}ZN;(3%<;}0UL8W9 zQ>%P3{1(T5v+|~f9Xj%-kl6R#k}uz-xW%QOQJ6&y=5IVvUX?OS0++U(0}2w1NITW76bn+rX<+D6{BPycQgKU?%!CTnb*SN9l@}{ntvErz+|E zlW#~X-4nGr&j=7ALmN8M(V8f^3oFBi!@izMo(q7LGH6+AwyxctYfzZ)r0aU-tsDMlTymYcxI4L<%A+j{Uaw06wPr92gZ{ZbBKKaO&bB zQ+uSMw4Q-7{B4jH3`LHO@7{GJ>*1~GSG0vxcX`0Dq0mXza2@}M_PX$iF5N?qYVDhV zYQYkP8_Yx0X?S2u)Rz|^JcCsg#pp!*0?bW`U$6Hk4>u-hf@Opm(cVLlMRenjSLMO( zs0%ivBtTS>?U}k?yz$pwmoy)4YJczYsc$ytZO_H63hMS}KC->!;K*-onR_v8L_`V2 z=qsT%cvr6!RuZs(Ew+KvB_q|5(el%6rqc;IOtLy5a3f3DkTzA^x}TNo=`Dn`hcAGzZF5fIR3tF+@Eg+ASNreqUCd#sFAruI z)@~?9n}F(8c%}FfYsaXns~33-x+_JmF-4yJl{sp zd=?1U66N>}+yuY5>qi-h)D2SY(;l;eo{D?%{k8_;-?*ltr(0EXq#$$QF&h!cGsu&$ z!D}5xSWzAigZkC>CY|Anz-Uu&a1P^pNJX4sZt!h)PNtJCt@?XNU!e1QmR@keL$g`fhi~UqFbQU*Eg>^$)OBY}oj<)f!3i!vMK1g~ zRW4AHkY|~_ez{Hp+z2YwC}5$ld7$m+5P%%kl=IfZwD}trLg{V59&co(hOsUJMze ziyy7)POsF4GtH1rrF=21H-9TeH2NDp;qdOb+Ed=Jz&!RTnDJLGwl-^WS!tJ&LGW6i zr3_(Z^!idbGx^zJ*pW{?*O~dRk8=`>oRu!M)ESGUq@RD~Ufo$9wQx6S?y1>Wha-R7 z&mpM22boU+Vq9K#5%T1|Q=)nw+^)2kpxb$@C!Jea<%NI%P!xFeMMcz4k!PWEmrX^} zz~jcDLQQ)!a%s&(p`UQPv3D`QCSRHl1_GH50HJt?VbC9*^{XQ<@G_}cZ9m4B__VZt zz6)+IeBp&^P?3dF*R*r=CX?bf-@f^{0Kn1bE{#H`{sZe5JKqS)aL>ug8*6VY9nAjB*Y!T zroKozsj(_eGw4J5PC7Pxcxqp~>R5O$xjcva!cS5z+Ca=jO+ZaoB9oIAeHnB zl^TqE*5?+(M)gXci;)ks;xeK}N?SD|E@1o}0NVf<@#MUZqg%+(noDVt#LZ7iT}n~u z5{&uRb*&ZdJ#~+kk4SqJu3nGydecrwi_fzD9$>}CJ^n@gGtBio5~C*a8^*gegIuz^ z1(z;H3=$=w$oO{b<>gB}-0yr9_bFNNUHNnmWPSDb>62r@;hN=SrbEnkKw8(8ykFnn z$W<4@hkyk8X~9np1&U!{?R`4+fhnXr(}7M4+Hgzs{O%A2T|mDa7zhQ>?8VN7FH$8Z z(hiD8y~{ZXzw*`V=;w+9&$4uTqyOQ40{UF>?^Y&J_69P4KQZ$rx9zGJz5Q}gVCY+V zB$@W7&hb+O_UhcI_PX?KiSq^c_k0@qgULAZB?#5^?;p~y6p23+xiqi=mGSYBm+$H} z6Q@gKxyP>hbAE3?+>5>Mj@+18L^lr@aFA=>`wx&)`5z-Ee2!>Iuc;wz=T;Q8>{Lot zkP|+aFgiH+pCIQae~z4h0=atE2G54irCYtq9SS%AZu%618J+fmZhr6JX0D}dJI$!n zVk>K&$?$BzQ?ZLLTgdg_hJxEv_eB-K&I}RYBMii98=;xbI6!Lj@s9rAk|ACHvgMPR z{zj1V5BvC;!6XeS`m7B;r_f1fZJQB$5au~*b2GX9^Pn>sysL~FYVpW5)#Cse0EH;) z3_wTd@U;&f%RWK`k4+s^jSG`9K4V#@phD@v^V%b zT4y^(fxI$H&o-y?Bje&2AIS!KbGzI#M3}u3NX~m(z9bhs`|;1n6%Z>KIn*ri!>k$U zFP7wdYU^gw)DEpR=Yf4M>MY5vu^+PL#v0Oj@N;(bZreic#B5h#W&;>l6jd%>DW2wO zk{7a@tJWQ*m+$o-I|Is)CC)01xb?Sv9s83!W}I3*u|bGG@*pX}AAPpn_!qE=*x@{t zpVLh{uV;;Fv@;pp+9LKtCs#c8Mn|@P|4y6+C}3hAel|z#!~HmV!sIMba?>MeTw#LfS-aqQ>k|`P%Ysg2tT{E2by#(+XDxbH(+fj@06BH z9F4hCS7EF-(yI8fV~V}{2}h7)N-&n+1_(&F$x4tGdB#)m)8EK_$II&vwa(0Nzv2ha zejt>5a?vJ020EHFm}LdFF=PkIoT1oaW4+A^RI4kGO1>7^RZSgr)AYHAMW<3l-^Gqo zz@N6?p%gk+&fe(ZfHML7nk9KSQ^}%pg^5mW1db`mU5s!Gwqyu4mGXp>POUAJb)wCT z>fhyi5AET1P@LA679D^X5@vxYUmRYeYIW6Lj0-P*nqw$>ehT2`S_b&a{N zF)cLd06F>t-)_r3Rfn-`o9D2{v>umzBA8|7RttAq9lT*!*cYlQqhGdOVy$UR^Vupt z$KV5)jLO;?2auZc7H&;EIp{#DnKfDPB*)@p>*DF{W4B8yqY*Yo2y|fLoAQe|Ff-5i zUKYWEPHlF`t#G`j8M?U|_Z0(b?|=D>wIz?NMN2H#jbD1xD7+$fxrS zDcfaiJb2`e^T;Vchyw&jO!t|rj9Ye$N#XHz%wT%-cueayKq!TdcBHXllFtQn8}Eu> zXS1GI`l>*Ro&@FT&vGZ^!>K(KC!k|SaxC}q=b0Y?<9g+ex*w|x?8-Y&2zUCb$h;n6 z@`@D{rvphDZS?F!`)&c1Ftb3p+WRzWeDss1qI z9~^CM(x0o$BH`M6?Z~OF0i+99L{62gZ@cC3-t8ruU!0Za@kU&vym##ZO})K7blMl1 z5=Y45jp?UWW%Ng(%N@p^zOc-5H-H?>@DzPdY%1l@0OUui3koa2Y%oBMgv3XB!Ica^ zziHoh?&vWN`H8iaxT1|!&P+-Xwae%H5UYUIka^1p8sg8NH!{@M@{NE@po`Ai;P>HU zvhD2sKB8kD#(PPAZQR<)@g3ffg0jXI2V~xO7CN&>cfa&nbSO#D+8Z-b4)F8e0e(J> zF7NlH&YcSoasZvx0IBwYZLMgn`8s<1*IR!QfAiL_@p%DWE4y#62d#Vn_ z>X(qwl_eyu?RfVEAV~Gk^6_E^Wa9nPRaxyVw0V-Yyii-w8nbh2X2tULh4f9_jq#7d zIv!p@+2F2$@~9n_;Gu1JnGr;cM><5d6*5VL&0MARHE(24K)Qq~Ys+-9Xxu?rtS&^? zW%c!%yhg{;$#3TXo?Q?5SEvXCipbGDsvSSbk53Z`*5-b%EV=F%LXS$HhAQ8nt05KD z1)fQ#*!SQ_7^4)j<~YW0AD|u^1@&_H34!kr=gy5WZ%E3vWi|z-$#UwC!BU*wXq=-b z4Hbg(V3&2>i4$lad~vXM$>7A7acME$MRJ(JRe^?CFViN)ONq8$DQP0R2UtDz8LX+F zyncQv>Pphl>9>_l^!kyFb(13jgUk1nlWH@oK^TN9{gF6UwyZY^_mF!ar%zyxkkAxyHA{Uz1 z%CUsgf6y@ff$|q~(XqG8h&(FHlKb=@KJ=A6K=vVE_~P0GZUbdN9pPQ_Px%^%*UuRC5r{Q8xc`TeTH zPVQjvl$XLgnHLhIn^8_(6;mxB_feNu4t^O8Nm%HiA+UI<4Hh{-Jf@tRzKmh6%dLd zDe^C`lx?+FmE=1q&jRXo;{9*FKI!%#f4Z@a%xgSU;vTJoF^=O1fX_$Nr%xTfOAafm z*!z*&U`2EsI=I4ii<9zmK`c5ti(rM%DQ&UzLb`2a-10!GuON@YwTX{3sge}D`&3!s zWkA!%hmBh2$`L^+AV9?6B=+XZJyBOn&F=xW7!am$)sNE5f}z|Zp}BA@NVt!8Az~JY za|t-oQsSucMqu1H>JvNG{u!sTZ55)YY`UXM|La@;^1JBz>s4>=e&&90#UKY_Qnn#3 z*CT1>OL}lhe{W1E%@h5|`;=&V_gcW=(I*cD9{8|u{5R~XrV!=BA1(D#XKg*h7FfBu zhQ^-wZ{XTP)|@?4l>wYbQND=WLk@L3Gx`un56c!3{-{YhX->MMoh?E-Dm%u8Z&QY= z#(`VrnK>1~t<6?>?&xNpeW&IkdJXLxtCU@xf~U9av-}-Z=)m5DYm}%t?K3~s*>=E? z{)4*?7=V8Uw15Q|xsxn#E-%qEOr(N#+1fL$6IU@hP+>!-^f*0+!1x1*z;l$<`%NNE(For>Iz+# zc`nDBkO876oAsV}ul|&0<)q1m#9ItNtn-!RUShZS)UADZ zQp~4h(AakQ9&#LqUV|^t+vnAPW}o{4-ogLh!siz5;&oTsUFnvL<`uj)jyEFh6&0#{ zf<#kV0+(OEh11*lVWkH%227p1nzq#<+!8F`?;G(u>kR3Q?b{^5Dh`mvz&3=##(>Oy zLRWA6`Pz`FVDUUyq(9@<*7C1ktXgAsQvmW~wxfdy=n`a>kDTO?#XPhUBOKE!w_CWzo4Jka z=SrT9TZG&WWpWVT!dS5XkVYZOkPJ`f&FQL+TigwyK;!~PgFydms#BhOOGd8V^ZSK^ zvV2tsXx8J@9%Cy#^6BpwJk;7|>$n*eu>vsTc z{GKu3km}&;G$?;c)_WvFD;^2k35W#Rc6b7L9+!>kL3W7U@6&WB^52@Zbg_$NXVVU8|q^)Udbx= zUgx3!m=x7Q-x<*h|Q?aH66Gtx1v7 zC}Vpl;w98_U=@H3dO!jWbXp=SB7-jxm#*aJoI2^~8NyXEeqAhBEYM4lb^k^3>`K?x z-1I+giqk^&lT*Jzg*}@#pL>7k6>ru~URlpA-JH&DBKiUE2zW!K%C)2aAW}eQME^OH ze#2N>EWY$>Ol;9x$7!jeKR@q5QLXJrly9fMMWi!V z5y^lJwYcD7vH5=5hHMCsT<;C!9~K&%>dnqe>K_>#B=eA%mq5a1p0*3B3kCQM^V5A& z!Q>YE8;1u^5IxHsPF+pBjr@%4$#(zA}fp` zbJN^h(ev{x$|qYEHa=XR!zvaZ&U%p%U*cE8_zw~+p>E&)nb8fXV93#m#U0n73kARu z<@|Y@?6B^nq|pM{5hYR4)^PdR_J2y*Yyc*o3VJDe4^&e3XWHc==PU9!=c~KV%C>jA z_uHiKtDNIfLd{v5x%R}AucJ=Sol9*%q@4p&D2qG+@*<+I0l75oYlw>T z8Qf$bk;;7zMgC(}=23?dA9Me?~uP_I)1+=(jO`Ji?1a$=GPfIQczufimC9_m(~oXA}3vP;r`;U*MxTrzc<=shuZJ! zm3ht;ChPbf7W!}? zc~%Z%CTExA+c-BLs(mf>P3$v7s*3(YPz=zB5{Um}L2S}Ja;e$ne49IXK{!rk~$p-A>51W~ zCYz%gLz%OHWJ>JY^4f}{o&+Qxzmod~i2s%qGq}G1nPBi#D%lphKPK5=*T2v#%^Z2u zXTFXBqxsCv{tM-eIlW*q$Yv;vz88rq2Cp-(?4YQ>SDkalze$xeV7Rshv=0bhz|)+PBs*q8=RY5hRQ0VZ-=cL`=6O95~-UZzvoGh!rJt*w!gwIa!QT7M)8)>p6%h zm@GND8@)A~VF)%#zRQ6;5Trm_|*k~yHmfz-DGuin(m~7Wo()Q=ayb?WYJ*3 znW$cTldmezNx7%*vaT3#tS3+Pa(FNbt|960nMl3Jf_*;-a{-jWSDPQ4eZZa=1`;o~ zFYG~*iW^sQD1o#{zUVjZd~RRdYoprpM*XD6#i{9P?sL9+9>R<}V%Uk2)~LIPiH3EJ z#ge)vDou!WQjY#EZ2{8MK=NtDmj_}AALmi~94l+Rm%r#byk{84QV=C#HBEoWVh&fn z9M;@W_%lucc6%N_q0cD`A9;<8m%I@iujCD^9G=<2{e#N*k5{S;O>`!?Dq@r|asRNz z|Murcb>}jfbl&N=_z*af-L*o9w!D*y6G^oe!)D*V&pQSet?lKGa7O_CbUOGJ>X9n} z#SUl~gLRvJEqa+nv?5?;O_lHWzv5Ki#1|$X+*8i(o)Uzv`JLJ7!#94!N=Zo>d9d_g zHnEGu(-rG)@p%0b8{fn)nipCuXj!-iv-f5^7zXYQ5qf>u1Bt-{F@kviMy`0tDm4<_ zG}#u@DMrmSHDHI9-cXi3LxX0Ta$t1DGXo?FfUrqD_U$=jSf8>^g-O8Nr_MgzdU?wnG zct8v=IBbFjH${*DS>peTj!khv&|_%-&yOtdU{fMrF4=VOh(-%r35r7`w-Sf3(W=tE z8@7D~ct|B2Sn3kY)JWc|p13di)I0e^-*QmIft&JAPtOrs(EN?Qg#>Z&RJ?0U*SWKb zA;sH^Kj;%3NMb0(@2)V>7ur_PKOzhC@BFcrjl0U}KLmk&eLz2aBM{!~rh=PTqSg20p;UT;U1e=t3;xGJdPbd%m6;OM7M0}X<&r!4!K`(ABT zd&=$q*9$fMXQ;x25l8+=GnhS-JuW;Ikxo!N=+n{0_ZjN;RN>k|F7gSsgHEyB+j6Ksmx==Ki&kt!8Ai z26JbW@cqlOQ;@&f;t*#<6VE7G<(K7pOU;>wMpm@%U5P|v<`oNFkq4Z9NZ=88!1=8w z0c#_Y zP0qOEP8FAj4p-|FzxKgoY(fn;Q|9pha45;3=tmla?g3|qw2C`Jp` zC(pS;6`BD%52%S^vHS^eBX2%0+(54=8ZH#B5ll}2x2LiiTZE1wuvg=$@N(}gI>a&Wyo!y=*D3-unLxJXO2AjUGDxY zB*oS{j|4Kcis||xt0D*4k*)Tgp^p0OJVj&>eDfYsWyP}_IqyEmF6w-*0*JG?ZDhfp zpB{a>W(^d9Rf3|Lo28Om{fS!pn=aV2W=LDqXDjk%t>bcxKAx@LZx^^Tcl223QGeL& zH0(dne!w)YOj$CGP2_@_KdSqQhpb0Ifrb)*><9)~z_<3G#Pn-1=0k@XE?!R3v1Cm- zQp3)hm=N7citm*=543PFR-MQr-Rng^ULKnBK0EnWHX0pTloi%@F>*4YW{49c?6*GT zf?mlT67y%8)&K)*{#VUoAWTG73=`gDJC?Ae^}`;UeJFhQ?*P5Y=u zn8^mvut*$q$!@D`lp`$0Jcry!smmtw$?ZX=G5dl~#LV!fmjoPXuvY=ByhP=_dn?&_ z(FI@etk`zOyMQCEoC#?bSH|{U$nu;ZU?lyjikRiZBd@+f_zSbSoVO+iOfy>IJk~Ec zZ#zZE{hOa2cD}}<`)#htM~{hzPF4GGdMV@z@i;Jz`!KLGRK!h>QxmFtbA?>+mm2gG zc7GAx2QzpfkJzUndaABfFK$eEQGoQltub+_fIEQ6V^p0-ybwD^mpHCXWy zII`Q+I60D)ADhUTj<0qI7}V>E4DuzHipRkA)|@eX=q&Ay4Zy91XUK`a!g&=Rtcf?5UmYYNevPVaYTG#p(trpMMyaAGc-RP&SIAtIg?emiyztoc^I$HR(te_-w)F zfw{G(Ipi#eBq4$JPlyq#q)R3asJt|`r1na`2mXHX2Vd= z^~(2KJN8i;6s=f%bT(}DfyQ%9MveC>jX~3`&*6*juaAD!7$|~=tAub}`6U4ANpphs zlBN8?%)8ikeeSxV3@(_(O<%EL9cfV{(s$+_a_oAbJ9J#T=*ZoR&HlE^r7+|B|3a7% zs-?~T4|QjfJkD)ThDl*f^l<{gwh9f#8-OCkh1ow#x{sN z2EEEtwwUq%F!ZyoFA0hzAT+c_N&^AY5{VVMxJVG#OV);IH)1CvzIn7MAg3+hz7I|)e0a5u7|7ilZ7E8&k;DGA?He*M}DU|vjYU1B7?d?uu=4A2@Qd; zGu1#LpAHGd+EM?3{%j=+pq^4!B=1ZX3Irat+zNqxokb)2C``i;jLTT%RO^3;(5L|+Zt4AoIu`r-A0dE6%QjmbyI z!;!c7`56(zM|~o}#kIhe?Rlm2`S)Cny!Tgf>60XUwukrm5&X=q0njqPm9H0KDAFsA zP~UujNSmz>s5FDi-q}w~>7^jO+R})BaLtnSOh<$~vPpeeT#7e=gd}JkwqOfr_kukP zZH+=f`<@6A1<<#DmV~BIL&Dxq{lu~BemKzUs*&nu(TCty=5O4FIZG04F(v9Z9&LJO z_Z@YP&Rs3Bo@s+WgC(4&Ri~x{Vz+&q=yCGf#@3QVpTm*f7t=6IQe#2i17719 z3~WlLmlXhtIdSVa7_}JrTefu1y5_7F%%9^}{!#tWQt65i5w?>=9L5Q>2MGA5sFY1pBFcM)qzB3yITEg@fi^u8?I4xjL^DFd6&}&-`fy(Sz z?!}3zvU`@YJp%m#p*vdtLK4(6D!P_I{@Q;V+2Y-&TSIoOVWrU<@`T3-R{(- zZA^%rtahkLBYJ5Az#C5^J^)d|GR`kEhouvVZ|ot`Ec=nnQc6vlPKD>!(qgF9Gh!QA z2ny;*a6IEd#YI~WNSs$#(iV`*3I zEUYmw3_XuNKRh`4>mGN3?A9-C;Y_7G|nSR3Cox2eqZY%E%x_x{b_zWAd*) z>w@+GhiZ)OwOa6X`&n=+H2c>xPwa$!j!4<9sM{RPPe+V0XCBM)bL<;)UhQ=Q{YwgI zWbT{ZE`U)>;I9FdH{~P60nsTib-OWsQWtZ8)Q0X8l}$9sA)8xVMq|cQ{+z0;;JzM+ z)u>w6vLu5h!5Y!sE^;gC<=XxR1d=}9*t!ilgYLeuq^|w5-wj)js#tvd6#WGK1b`#* zx+duVSkTKQq=g>VU(vh7rweAwe(2r)h;R*{!E5DU1_Hrw3;BS zOt3DT{_e~;!9L7j@mv1a{e)N;KD-}#4+7A(!H&Z@@iCb)LfT9_8*>2UFuP{T#vU!@ zFfXH{*C<1l+ryzJA0ZQkqqp1-&kL<-wQS8d@{imbPB}8vms&R6d>(%gMHMzu#3I_lA(?r}w*w?4nUC%*&?W3X4YWTVXd@QprA`$NwZ6@~_A zLt}=RIsa0>C+>f2%+RKFLl*=N^A2Gl+A(BkR0%}^oFX=TRooXymetYITlZd;f(hG( z^F@vFvCS=-1Bn#;9iq$2>SH`7_F*t%l>4C%MI6EWwL=Arz4B-BOd zM}}HM4eI~l+721q)n7l?mw^Wt>~27%Lv33`7ws>Y8^;LKIT4D66Xv2HQR-HB&WqW| zSB@5PtL6N!XCo~>Bv&4u-5&upc0By6tqcZ6KJ

&|nteia!dX5%P_L|6wKcvNO>C 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 literal 0 HcmV?d00001 diff --git a/docs/source/testDataTypesSimulator.png b/docs/source/testDataTypesSimulator.png new file mode 100644 index 0000000000000000000000000000000000000000..5740f1385465ae67288dabae43f681f835e03e3a GIT binary patch literal 74748 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 on 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 - - - modbus - - - -

- modbus

-

- Module Owner: Mark Rivers: University of Chicago

-

- This page is the home of modbus

-

- modbus supports EPICS communication with Programmable Logic Controllers (PLCs) - via the Modbus protocol over TCP, serial RTU, and serial ASCII links.

-

- The modbus software provides a layer between standard EPICS asyn device support, - and the EPICS asyn TCP/IP or serial port driver.

-

- Please email any comments and bug reports to - Mark Rivers who is responsible for coordinating development and releases.

-

- Where to find it

-

- The software can be downloaded from the links in the table below. The software can - also be accessed through the github - repository.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Module Version - Release Date - Filename - Documentation - Release Notes - Known Problems
- 2-10-1 - 15-September-2017 - R2-10-1 tar - and zip files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-10 - 15-September-2017 - R2-10 tar and - zip files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-9 - 23-August-2016 - R2-9 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-8 - 8-February-2016 - R2-8 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-7 - 19-August-2014 - R2-7 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-6 - 10-April-2014 - R2-6 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-5 - 2-October-2013 - R2-5 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-4 - 22-May-2012 - R2-4 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-3 - 9-September-2011 - R2-3 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-2 - 13-March-2011 - R2-2 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-1 - 7-November-2010 - R2-1 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 2-0 - 27-November-2009 - R2-0 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 1-3 - 19-Septermber-2008 - R1-3 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 1-2 - 6-September-2007 - R1-2 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
- 1-1 - 30-April-2007 - R1-1 tar and zip - files - modbusDoc.html - modbusReleaseNotes.html - See release notes
-

- Required Modules

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Module version - Requires module - Release needed - Required for
- 2-10, 2-10-1 - EPICS base - 3.15.5 - Base support
- asyn - 4-32 - Driver support
- 2-9 - EPICS base - 3.14.12.5 - Base support
- asyn - 4-30 - Driver support
- 2-8 - EPICS base - 3.14.12.5 - Base support
- asyn - 4-28 - Driver support
- 2-7 - EPICS base - 3.14.12.4 - Base support
- asyn - 4-23 - Driver support
- 2-6 - EPICS base - 3.14.12.3 - Base support
- asyn - 4-22 - Driver support
- 2-5 - EPICS base - 3.14.12.3 - Base support
- asyn - 4-21 - Driver support
- 2-4 - EPICS base - 3.14.12.2 - Base support
- asyn - 4-19 - Driver support
- 2-3 - EPICS base - 3.14.12.1 - Base support
- asyn - 4-17 - Driver support
- 2-2 - EPICS base - 3.14.12 - Base support
- asyn - 4-15 - Driver support
- 2-1 - EPICS base - 3.14.11 - Base support
- asyn - 4-14 - Driver support
- 2-0 - EPICS base - 3.14.10 - Base support
- asyn - 4-12 - Driver support
- 1-3 - EPICS base - 3.14.8.2 - Base support
- asyn - 4-10 - Driver support
- 1-2 - EPICS base - 3.14.8.2 - Base support
- asyn - 4-8 - Driver support
- 1-1 - EPICS base - 3.14.8.2 - Base support
- asyn - 4-8 - Driver support
-

- Installation and Building

-

- After obtaining a copy of the distribution, it must be installed and built for use - at your site. These steps only need to be performed once for the site (unless versions - of the module running under different releases of EPICS and/or the other required - modules are needed).

-
    -
  1. Create an installation directory for the module, usually this will end with
    -
    - .../support/ -
    -
  2. -
  3. Place the distribution file in this directory. Then issue the commands (Unix style) -
     tar xvzf modbusRX-Y.tgz
    -  
    - where X-Y is the release.
  4. -
  5. This creates a <top> application.
    -
      .../support/modbusRX-Y
    -  
    -
  6. -
  7. Edit the configure/RELEASE file and set the paths to your installation - of EPICS base and to your versions of other required modules.
  8. -
  9. Run gnumake in the top level directory and check for any compilation - errors.
  10. -
  11. Please email  Mark Rivers  - so that a record can be kept of which sites are using this software.
  12. -
-

- In Use

-

- This software was originally developed by Mark Rivers, based on an earlier package - by Rolf Keitel from Triumf.

-
    -
  • ANL/APS : In use at CARS and other beamlines.
  • -
  • NSLS X-26A beamline
  • -
  • SLAC
  • -
  • CEA in France
  • -
  • Australian synchrotron. ID5 microspectroscopy beamline.
  • -
- - diff --git a/documentation/modbusDoc.html b/documentation/modbusDoc.html deleted file mode 100644 index 0fb4054..0000000 --- a/documentation/modbusDoc.html +++ /dev/null @@ -1,2657 +0,0 @@ - - - - modbus EPICS driver support - - - -
-

- modbus

-

- Driver Support for Modbus Protocol under EPICS

-

- Release 2-10-1

-

- Mark Rivers

-

- September 15, 2016

-
-
-

- Contents

- -

- Acknowledgments

-

- The modbus package is based on the - modtcp and plctcp packages written by Rolf Keitel from Triumf. The modtcp - package was originally converted to Linux by Ivan So from NSLS. modbus was - extensively re-written for conversion to EPICS 3.14 and to use the EPICS asyn module. - It now contains little of the original modtcp code, but retains much of the - original architecture.

-

- Overview of Modbus

-

- MODBUS is an application layer messaging protocol, positioned at level 7 of the - OSI model, that provides client/server communication between devices connected on - different types of buses or networks. It is typically used for communication with - I/O systems, including Programmable Logic Controllers (PLCs).

-

- Modbus communication links

-

- Modbus supports the following 3 communication-link layers: -

- - - - - - - - - - - - - - - - - - - - - - -
- Modbus Communication Links
- Link type - Description
- TCP - TCP/IP using standard port 502.
- RTU - RTU is normally run over serial communication links, i.e. RS-232, RS-422, or RS-485. - RTU uses an additional CRC for packet checking. The protocol directly transmits - each byte as 8 data bits, so uses "binary" rather than ASCII encoding. When using - serial links start and end of message frames is detected by timing rather than by - specific characters. RTU can also be run over TCP, though this is less common than - the standard Modbus TCP without RTU.
- Serial ASCII - Serial protocol, which is normally run over serial communication links, i.e. RS-232, - RS-422, or RS-485. Serial ASCII uses an additional LRC for packet checking. The - protocol encodes each byte as 2 ASCII characters. The start and end of message frames - is detected by specific characters (":" to start a message and CR/LF to end a message). - This protocol is less efficient than RTU, but may be more reliable in some environments. - ASCII can also be run over TCP, though this is much less common than the standard - Modbus TCP.
-

- This modbus package supports all of the above Modbus communication-link layers. -

-

- Modbus data types

-

- Modbus provides access to the following 4 types of data: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Modbus Data Types
- Primary tables - Object type - Access - Comments
- Discrete Inputs - Single bit - Read-Only - This type of data can be provided by an I/O system.
- Coils - Single bit - Read-Write - This type of data can be alterable by an application program.
- Input Registers - 16-bit word - Read-Only - This type of data can be provided by an I/O system.
- Holding Registers - 16-bit word - Read-Write - This type of data can be alterable by an application program.
-

- Modbus communications

-

- Modbus communication consists of a request message sent from the Modbus - client to the Modbus server. The server replies with a response message. - Modbus request messages contain:

-
    -
  • An 8-bit Modbus function code that describes the type of data transfer to be performed.
  • -
  • A 16-bit Modbus address that describes the location in the server to read or write - data from.
  • -
  • For write operations, the data to be transferred.
  • -
-

- Modbus function codes

-

- modbus supports the following 9 Modbus function codes: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Modbus Function Codes
- Access - Function description - Function code
- Bit access - Read Coils - 1
- Bit access - Read Discrete Inputs - 2
- Bit access - Write Single Coil - 5
- Bit access - Write Multiple Coils - 15
- 16-bit word access - Read Input Registers - 4
- 16-bit word access - Read Holding Registers - 3
- 16-bit word access - Write Single Register - 6
- 16-bit word access - Write Multiple Registers - 16
- 16-bit word access - Read/Write Multiple Registers - 23
-

- Modbus addresses

-

- Modbus addresses are specified by a 16-bit integer address. The location of inputs - and outputs within the 16-bit address space is not defined by the Modbus protocol, - it is vendor-specific. The following table lists some of the commonly used Modbus - addresses for Koyo PLCs.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Modbus Addresses for
- Koyo DL05/06/240/250/260/430/440/450 PLCs
- PLC Memory Type - Modbus start address -
- Decimal (octal)
- Function codes
- Discrete inputs and coils
- Inputs (X) - 2048 (04000) - 2
- Special Relays (SP) - 3072 (06000) - 2
- Outputs (Y) - 2048 (04000) - 1, 5, 15
- Control Relays (C) - 3072 (06000) - 1, 5, 15
- Timer Contacts (T) - 6144 (014000) - 1, 5, 15
- Counter Contacts (CT) - 6400 (014400) - 1, 5, 15
- Stage Status Bits (S) - 6144 (012000) - 1, 5, 15
- Input registers and holding registers (V memory)
- Timer Current Values (TA) - 0 (00) - 4
- Counter Current Values (CTA) - 512 (01000) - 4
- Global Inputs (VGX) - 16384 (040000) - 4
- Global Outputs (VGY) - 16512 (040200) - 3, 6, 16
- Inputs (VX) - 16640 (040400) - 4
- Outputs (VY) - 16704 (040500) - 3, 6, 16
- Control Relays (VC) - 16768 (040600) - 3, 6, 16
- Stage Status Bits (VS) - 16896 (041000) - 3, 6, 16
- Timer Contacts (VT) - 16960 (041100) - 3, 6, 16
- Counter Contacts (VCT) - 16992 (041140) - 3, 6, 16
- Special Relays (VSP) - 17024 (041200) - 4
-

- Other PLC manufacturers will use different Modbus addresses. -

-

- Note that 16-bit Modbus addresses are commonly specified with an offset of 400001 - (or 300001). This offset is not used by the modbus driver, it uses only the - 16-bit address, not the offset. -

-

- Modbus data length limitations

-

- Modbus read operations are limited to transferring 125 16-bit words or 2000 bits. - Modbus write operations are limited to transferring 123 16-bit words or 1968 bits.

-

- More information on Modbus

-

- For more information about the Modbus protocol, the official Modbus specification - can be found - on the Web or in the modbus - documentation directory. -

-

- The official specification for Modbus over TCP/IP can be found - on the Web or in the modbus - documentation directory. -

-

- The official specification for Modbus over serial can be found - on the Web or in the modbus - documentation directory. -

-

- Driver architecture

-

- CAUTION: modbus can provide access to all of the I/O and memory of - the PLC. In fact, it is not even necessary to run a ladder logic program in the - PLC at all. The PLC can be used as a "dumb" I/O subsystem, with all of the logic - residing in the EPICS IOC. However, if a ladder logic program is being run - in the PLC then the EPICS access with modbus must be designed carefully. - For example, the EPICS IOC might be allowed to read any of the PLC I/O points - (X inputs, Y outputs, etc.), but writes could be restricted to a small range - of Control Registers, (e.g. C200-C240). The ladder logic would monitor these control - registers, considering them to be "requests" from EPICS that should be acted upon - only if it is safe to do so.

-

- The architecture of the modbus module from the top-level down consists of - the following 4 layers:

-
    -
  1. - EPICS asyn device support. . This is the general purpose device support provided - with asyn There is - no special device support needed or provided with modbus.
  2. -
  3. An EPICS asyn port driver that functions as a Modbus client. The modbus - port driver communicates with EPICS device support (layer 1) using the standard - asyn interfaces (asynUInt32Digital, asynInt32, etc.). This driver sends and receives - device-independent Modbus frames via the standard asynOctet interface to the "interpose - interface" (layer 3). These frames are independent of the underlying communications - protocol.
  4. -
  5. An asyn "interpose interface" layer that handles the additional data required - by the underlying communications layer (TCP, RTU, ASCII). This layer communicates - via the standard asynOctet interface to both the overlying Modbus driver (layer - 2) and to the underlying asyn hardware port driver (layer 4).
  6. -
  7. An asyn port driver that handles the low-level communication (TCP/IP or serial). - This is one of the standard port drivers provided with asyn, i.e. - drvAsynIPPort or - drvAsynSerialPort. They are not part of the modbus module.
  8. -
-

- Because modbus makes extensive use of existing asyn facilities, and only - needs to implement layers 2 and 3 above, the amount of code in modbus is - quite small (fewer than 2,500 lines). -

-

- Each modbus port driver is assigned a single Modbus function code. Usually - a drivers is also assigned a single contiguous range of Modbus memory, up to 2000 - bits or 125 words. One typically creates several modbus port drivers for - a single PLC, each driver reading or writing a different set of discrete inputs, - coils, input registers or holding registers. For example, one might create one port - driver to read discrete inputs X0-X37, a second to read control registers C0-C377, - and a third to write control registers C300-C377. In this case the asyn address - that is used by each record is relative to the starting address for that driver.

-

- It is also possible to create a driver is allowed to address any location in the - 16-bit Modbus address space. Each read or write operation is still limited to the - 125/123 word limits. In this case the asyn address that is used by each record is - the absolute Modbus address. -

-

- The behavior of the port driver differs for read function codes (1, 2, 3, 4), write - function codes (5, 6, 15, 16), and read/write function codes (23). -

-

- Modbus read functions

-

- For read function codes (when absolute addressing is not being used) the driver - spawns a poller thread. The poller thread reads the entire block of Modbus memory - assigned to this port in a single Modbus transaction. The values are stored in a - buffer in the driver. The delay between polls is set when the port driver is created, - and can be changed later at run-time. The values are read by EPICS using the standard - asyn interfaces (asynUInt32Digital, asynInt32, asynFloat64, etc.) The values that - are read are the last stored values from the poller thread. The means that EPICS - read operations are asynchronous, i.e. they can block. This is because although - they do not directly result in Modbus I/O, they do need to wait for a mutex that - indicates that the poller thread is done. -

-

- For read functions it is possible to set the EPICS records to "I/O Intr" scanning. - If this is done then the port driver will call back device support whenever there - is new data for that input. This improves efficiency, because such records only - process when needed, they do not need to be periodically scanned. -

-

- The previous paragraphs describe the normal configuration for read operations, where - relative Modbus addressing is being used. If absolute addressing is being used then - the driver does not create a poller thread, because it does not know what parts - of the Modbus address space should be polled. In this case read records cannot have - SCAN=I/O Intr. They must either be periodically scanned, or scanned by directly - causing the record to process, such as writing 1 to the .PROC field. Each time the - record processes it will result in a separate Modbus read operation. NOTE: This - is much less efficient that reading many registers at once with relative - Modbus addressing. For this reason absolute Modbus addressing with read functions - should normally be avoided.

-

- Modbus write functions

-

- For write function codes the driver does not itself create a separate thread. Rather - the driver does the Modbus I/O immediately in response to the write operations on - the standard asyn interfaces. This means that EPICS write operations are also asynchronous, - i.e. they block because Modbus I/O is required. When the modbus driver is - created it tells asynManager that it can block, and asynManager creates a separate - thread that executes the write operations. -

-

- Word write operations using the asynUInt32Digital interface (with a mask parameter - that is not 0x0 or 0xFFFF) are done using read/modify/write operations. This allows - multiple Modbus clients to write and read single words in the same block of Modbus - memory. However, it does not guarantee correct operation if multiple Modbus - clients (or the PLC itself) can modify bits within a single word. This is because - the Modbus server cannot perform the read/modify/write I/O as an atomic operation - at the level of the Modbus client. -

-

- For write operations it is possible to specify that a single read operation should - be done when the port driver is created. This is normally used so that EPICS obtains - the current value of an output device when the IOC is initialized.

-

- Modbus RTU specifies a minimum delay of 3.5 character times between writes to the - device. The modbusInterposeConfig function allows one to specify a write delay in - msec before each write.

-

- Modbus write/read functions

-

- Modbus function code 23 allows for writing a set of registers and reading a set - of registers in a single operation. The read operation is performed after the write - operation, and the register range to be read can be different from the register - range to be written. Function code 23 is not widely used, and the write/read operation - is not a good fit to the modbus driver model of read-only and write-only - drivers. Function code 23 is implemented in modbus with the following restrictions:

-
    -
  • A driver that uses Modbus function code 23 is either read-only or write-only.
  • -
  • A read-only driver is created by specifying function code 123 to the drvModbusAsynConfigure - command described below. The driver will use Modbus function code 23 for the Modbus - protocol. It will only read registers (like function codes 3 and 4), it will not - write any data to the device.
  • -
  • A write-only driver is created by specifying function code 223 to the drvModbusAsynConfigure - command described below. The driver will use Modbus function code 23 for the Modbus - protocol. It will only write registers (like function code 16), it will not read - any data from the device.
  • -
-

- Platform independence

-

- modbus should run on all EPICS platforms. It has been tested on linux-x86, - linux-x86_64, vxWorks, win32-x86, windows-x64, (native Windows with Microsoft Visual - Studio 2010 C++ compiler), and cygwin-x86 (Windows with gcc compiler and Cygwin - library). -

-

- The only thing that may be architecture dependent in modbus is the structure - packing in modbus.h. The "#pragma pack(1)" directive used there is supported on - gnu and Microsoft compilers. If this directive is not supported on some compilers - of interest then modbus.h will need to have the appropriate architecture dependent - code added. -

-

- Creating a modbus port driver

-

- Before modbus port drivers can be created, it is necessary to first create - at least one asyn TCP/IP or serial port driver to communicate with the hardware. - The commands required depend on the communications link being used.

-

- TCP/IP

-

- For TCP/IP use the following standard asyn command: -

-
drvAsynIPPortConfigure(portName, hostInfo, priority, noAutoConnect, noProcessEos)
-
-

- Documentation on this command can be found in the - asynDriver documentation. -

-

- The following example creates an asyn IP port driver called "Koyo1" on port 502 - at IP address 164.54.160.158. The default priority is used and the noAutoConnect - flag is set to 0 so that asynManager will do normal automatic connection management. - The noProcessEos flag is set to 1 because Modbus over TCP does not require end-of-string - processing. -

-
drvAsynIPPortConfigure("Koyo1","164.54.160.158:502",0,0,1)
-
-

- Serial RTU

-

- For serial RTU use the following standard asyn commands: -

-
drvAsynSerialPortConfigure(portName, ttyName, priority, noAutoConnect, noProcessEos)
-asynSetOption(portName, addr, key, value)
-
-

- Documentation on these commands can be found in the - asynDriver documentation. -

-

- The following example creates an asyn local serial port driver called "Koyo1" on - /dev/ttyS1. The default priority is used and the noAutoConnect flag is set to 0 - so that asynManager will do normal automatic connection management. The noProcessEos - flag is set to 0 because Modbus over serial requires end-of-string processing. The - serial port parameters are configured to 38400 baud, no parity, 8 data bits, 1 stop - bit.

-
drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0)
-asynSetOption("Koyo1",0,"baud","38400")
-asynSetOption("Koyo1",0,"parity","none")
-asynSetOption("Koyo1",0,"bits","8")
-asynSetOption("Koyo1",0,"stop","1")
-
-

- Serial ASCII

-

- For serial ASCII use the same commands described above for serial RTU. After the - asynSetOption commands use the following standard asyn commands:

-
asynOctetSetOutputEos(portName, addr, eos)
-asynOctetSetInputEos(portName, addr, eos)
-
-

- Documentation on these commands can be found in the - asynDriver documentation.

-

- The following example creates an asyn local serial port driver called "Koyo1" on - /dev/ttyS1. The default priority is used and the noAutoConnect flag is set to 0 - so that asynManager will do normal automatic connection management. The noProcessEos - flag is set to 0 because Modbus over serial requires end-of-string processing. The - serial port parameters are configured to 38400 baud, no parity, 8 data bits, 1 stop - bit. The input and output end-of-string is set to CR/LF. -

-
drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0)
-asynSetOption("Koyo1",0,"baud","38400")
-asynSetOption("Koyo1",0,"parity","none")
-asynSetOption("Koyo1",0,"bits","8")
-asynSetOption("Koyo1",0,"stop","1")
-asynOctetSetOutputEos("Koyo1",0,"\r\n")
-asynOctetSetInputEos("Koyo1",0,"\r\n")
-
-

- modbusInterposeConfig

-

- After creating the asynIPPort or asynSerialPort driver, the next step is to add - the asyn "interpose interface" driver. This driver takes the device-independent - Modbus frames and adds or removes the communication-link specific information for - the TCP, RTU, or ASCII link protocols. The interpose driver is created with the - command:

-
modbusInterposeConfig(portName, 
-                      linkType,
-                      timeoutMsec,
-                      writeDelayMsec)
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- modbusInterposeConfig command
- Parameter - Data type - Description
- portName - string - Name of the asynIPPort or asynSerialPort previously created.
- linkType - int - Modbus link layer type:
- 0 = TCP/IP
- 1 = RTU
- 2 = ASCII
- timeoutMsec - int - The timeout in milliseconds for write and read operations to the underlying asynOctet - driver. This value is used in place of the timeout parameter specified in EPICS - device support. If zero is specified then a default timeout of 2000 milliseconds - is used.
- writeDelayMsec - int - The delay in milliseconds before each write from EPICS to the device. This is typically - only needed for Serial RTU devices. The Modicon Modbus Protocol Reference Guide - says this must be at least 3.5 character times, e.g. about 3.5ms at 9600 baud, for - Serial RTU. The default is 0.
-

- For the serial ASCII example above, after the asynOctetSetInputEos command, the - following command would be used. This uses a timeout of 1 second, and a write delay - of 0 ms.

-
modbusInterposeConfig("Koyo1",2,1000,0)
-
-

- drvModbusAsynConfigure

-

- Once the asyn IP or serial port driver has been created, and the modbusInterpose - driver has been configured, a modbus port driver is created with the following - command:

-
drvModbusAsynConfigure(portName, 
-                       tcpPortName,
-                       slaveAddress, 
-                       modbusFunction, 
-                       modbusStartAddress, 
-                       modbusLength,
-                       dataType,
-                       pollMsec, 
-                       plcType);
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- drvModbusAsynConfigure command
- Parameter - Data type - Description
- portName - string - Name of the modbus port to be created.
- tcpPortName - string - Name of the asyn IP or serial port previously created.
- slaveAddress - int - The address of the Modbus slave. This must match the configuration of the Modbus - slave (PLC) for RTU and ASCII. For TCP the slave address is used for the "unit identifier", - the last field in the MBAP header. The "unit identifier" is ignored by most PLCs, - but may be required by some.
- modbusFunction - int - Modbus function code (1, 2, 3, 4, 5, 6, 15, 16, 123 (for 23 read-only), or 223 (for - 23 write-only)).
- modbusStartAddress - int - Start address for the Modbus data segment to be accessed. For relative addressing - this must be in the range 0-65535 decimal, or 0-0177777 octal. For absolute addressing - this must be set to -1.
- modbusLength - int - The length of the Modbus data segment to be accessed.
- This is specified in bits for Modbus functions 1, 2, 5 and 15.
- It is specified in 16-bit words for Modbus functions 3, 4, 6, 16, or 23.
- Length limit is 2000 for functions 1 and 2, 1968 for functions 5 and 15,
- 125 for functions 3 and 4, and 123 for functions 6, 16, and 23.
- For absolute addressing this must be set to the size of required by the largest - single Modbus operation that may be used. This would be 1 if all Modbus reads and - writes are for 16-bit registers, but it would be 4 if 64-bit floats (4 16-bit registers) - are being used, and 100 (for example) if an Int32 waveform record with NELM=100 - is being read or written.
- modbusDataType - int - This sets the default data type for this port. This is the data type used if the - drvUser field of a record is empty, or if it is MODBUS_DATA. The supported Modbus - data types and correponding drvUser fields are described in the table below.
- pollMsec - int - Polling delay time in msec for the polling thread for read functions.
- For write functions, a non-zero value means that the Modbus data should
- be read once when the port driver is first created.
- plcType - string - Type of PLC (e.g. Koyo, Modicon, etc.). -
- This parameter is currently used to print information in asynReport.
- It is also used to treat Wago devices specially if the plcType string contains the - substring "Wago". See the note below.
-

- Modbus register data types -

-

- Modbus function codes 3, 4, 6, and 16 are used to access 16-bit registers. The Modbus - specification does not define how the data in these registers is to be interpreted, - for example as signed or unsigned numbers, binary coded decimal (BCD) values, etc. - In fact many manufacturers combine multiple 16-bit registers to encode 32-bit integers, - 32-bit or 64-bit floats, etc. The following table lists the data types supported - by modbus. The default data type for the port is defined with the modbusDataType - parameter described above. The data type for particular record can override the - default by specifying a different data type with the drvUser field in the link. - The driver uses this information to convert the number between EPICS device support - and Modbus. Data is transferred to and from EPICS device support as epicsUInt32, - epicsInt32, and epicsFloat64 numbers. Note that the data type conversions described - in this table only apply for records using the asynInt32 or asynFloat64 interfaces, - they do not apply when using the asynUInt32Digital interface. The asynUInt32Digital - interface always treats the registers as unsigned 16-bit integers. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Supported Modbus data types
- modbusDataType value - drvUser field - Description
- 0 - UINT16 - Unsigned 16-bit binary integers
- 1 - INT16SM - 16-bit binary integers, sign and magnitude format. In this format bit 15 is the - sign bit, and bits 0-14 are the absolute value of the magnitude of the number. This - is one of the formats used, for example, by Koyo PLCs for numbers such as ADC conversions. -
- 2 - BCD_UNSIGNED - Binary coded decimal (BCD), unsigned. This data type is for a 16-bit number consisting - of 4 4-bit nibbles, each of which encodes a decimal number from 0-9. A BCD number - can thus store numbers from 0 to 9999. Many PLCs store some numbers in BCD format. -
- 3 - BCD_SIGNED - 4-digit binary coded decimal (BCD), signed. This data type is for a 16-bit number - consisting of 3 4-bit nibbles, and one 3-bit nibble. Bit 15 is a sign bit. Signed - BCD numbers can hold values from -7999 to +7999. This is one of the formats used - by Koyo PLCs for numbers such as ADC conversions.
- 4 - INT16 - 16-bit signed (2's complement) integers. This data type extends the sign bit when - converting to epicsInt32.
- 5 - INT32_LE - 32-bit integers, little endian (least significant word at Modbus address N, most - significant word at Modbus address N+1)
- 6 - INT32_BE - 32-bit integers, big endian (most significant word at Modbus address N, least significant - word at Modbus address N+1)
- 7 - FLOAT32_LE - 32-bit floating point, little endian (least significant word at Modbus address N, - most significant word at Modbus address N+1)
- 8 - FLOAT32_BE - 32-bit floating point, big endian (most significant word at Modbus address N, least - significant word at Modbus address N+1)
- 9 - FLOAT64_LE - 64-bit floating point, little endian (least significant word at Modbus address N, - most significant word at Modbus address N+3)
- 10 - FLOAT64_BE - 64-bit floating point, big endian (most significant word at Modbus address N, least - significant word at Modbus address N+3)
- 11 - STRING_HIGH - String data. One character is stored in the high byte of each register.
- 12 - STRING_LOW - String data. One character is stored in the low byte of each register.
- 11 - STRING_HIGH_LOW - String data. Two characters are stored in each register, the first in the high byte - and the second in the low byte.
- 11 - STRING_LOW_HIGH - String data. Two characters are stored in each register, the first in the low byte - and the second in the high byte.
-

- Note that if it is desired to transmit BCD numbers untranslated to EPICS over the - asynInt32 interface, then data type 0 should be used, because no translation is - done in this case.

-

- The following is an example ai record using 32-bit floating point values:

-
-# ai record template for register inputs
-record(ai, "$(P)$(R)") {
-    field(DTYP,"asynFloat64")
-    field(INP,"@asyn($(PORT) $(OFFSET))FLOAT32_LE")
-    field(HOPR,"$(HOPR)")
-    field(LOPR,"$(LOPR)")
-    field(PREC,"$(PREC)")
-    field(SCAN,"$(SCAN)")
-}   
-
-

- Note for Wago devices

-

- This initial read operation is normally done at the same Modbus address as the write - operations. However, Wago devices are different from other Modbus devices because - the address to read back a register is not the same as the address to write the - register. For Wago devices the address used to read back the initial value for a - Modbus write function must be 0x200 greater than the address for the write function. - This is handled by adding this 0x200 offset for the readback address if the plcType - argument to drvModbusAsynConfigure contains the substring "Wago" (case sensitive). - Note that this does not affect the address for Wago read functions. The user must - specify the actual Modbus address for read functions.

-

- Number of drvAsynIPPort drivers for TCP -

-

- Each drvAsynIPPort driver creates a separate TCP/IP socket connection to the PLC. - It is possible to have all of the modbus port drivers share a single drvAsynIPPort - driver. In this case all I/O to the PLC is done over a single socket in a "serial" - fashion. A transaction for one modbus driver must complete before a transaction - for another modbus driver can begin. It is also possible to create multiple - drvAsynIPPort drivers (sockets) to a single PLC and, for example, use a different - drvAsynIPPort for each modbus port. In this case I/O operations from multiple - modbus drivers can proceed in parallel, rather than serially. This could - improve performance at the expense of more CPU load on the IOC and PLC, and more - network traffic.

-

- It is important to note, however, that many PLCs will time out sockets after a few - seconds of inactivity. This is not a problem with modbus drivers that use - read function codes, because they are polling frequently. But modbus drivers - that use write function codes may only do occasional I/O, and hence may time out - if they are the only ones communicating through a drvAsynIPPort driver. Thus, it - is usually necessary for modbus drivers with write function codes to use - the same drvAsynIPPort driver (socket) as at least one modbus driver with - a read function code to avoid timeouts.

-

- The choice of how many drvAsynIPPort drivers to use per PLC will be based on empirical - performance versus resource usage considerations. In general it is probably a good - idea to start with one drvAsynIPPort server per PLC (e.g. shared by all modbus - drivers for that PLC) and see if this results in satisfactory performance.

-

- Number formats

-

- It can be convenient to specify the modbusStartAddress and modbusLength in octal, - rather than decimal, because this is the convention on most PLCs. In the iocsh and - vxWorks shells this is done by using a leading 0 on the number, i.e. 040400 is an - octal number.

-

- EPICS device support

-

- modbus implements the following standard asyn interfaces: -

-
    -
  • asynUInt32Digital
  • -
  • asynInt32
  • -
  • asynInt32Array
  • -
  • asynFloat64
  • -
  • asynOctet
  • -
  • asynCommon
  • -
  • asynDrvUser
  • -
-

- Because it implements these standard interfaces, EPICS device support is done entirely - with the generic EPICS device support provided with asyn itself. There is no special - device support provided as part of modbus.

-

- It is necessary to use asyn R4-8 or later, because some minor enhancements were - made to asyn to support the features required by modbus. -

-

- The following tables document the asyn interfaces used by the EPICS device support. -

-

- The drvUser parameter is used by the driver to determine what command is - being sent from device support. The default is MODBUS_DATA, which is thus optional - in the link specification in device support. If no drvUser field is specified, - or if MODBUS_DATA is specified, then the Modbus data type for records using the - asynInt32 and asynFloat64 interfaces is the default data type specified in the drvModbusAsynConfigure - command. Records can override the default Modbus data type by specifying datatype-specific - drvUser field, e.g. BCD_SIGNED, INT16, FLOAT32_LE, etc.

-

- The offset parameter is used to specify the location of the data for a record - relative to the starting Modbus address for that driver. This offset is specified - in bits for drivers using Modbus functions 1, 2, 5, and 15 that control discrete - inputs or coils. For example, if the Modbus function is 2 and the Modbus starting - address is 04000, then offset=2 refers to address 04002. For a Koyo PLC the - X inputs are at this Modbus starting address for Modbus function 2, so offset=2 - is input X2.

-

- If absolute addressing is being used then the offset parameter is an absolute - 16-bit Modbus address, and is not relative to the starting Modbus address, which - is -1.

-

- The offset is specified in words for drivers using Modbus functions 3, 4, - 6 and 16 that address input registers or holding registers. For example, if the - Modbus function is set to 6 and the Modbus address is 040600 then offset=2 - refers to address 040602. For a Koyo PLC the C control relays are accessed as 16-bit - words at this Modbus starting address for Modbus function 6. offset=2 will - thus write to the third 16 bit-word, which is coils C40-C57.

-

- For 32-bit or 64-bit data types (INT32_LE, INT32_BE, FLOAT32_LE, FLOAT32_BE) the - offset specifies the location of the first 16-bit register, and the second - register is at offset+1, etc.

-

- For string data types (STRING_HIGH, STRING_LOW, STRING_HIGH_LOW, STRING_LOW_HIGH) - the offset specifies the location of the first 16-bit register, and the second - register is at offset+1, etc.

-

- asynUInt32Digital

-

- asynUInt32Digital device support is selected with -

-
field(DTYP,"asynUInt32Digital")
-field(INP,"@asynMask(portName,offset,mask,timeout)drvUser")
-    
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- asynUInt32Digital Device Support
- Modbus function - Offset type - Data type - drvUser - Records supported - Description
- 1, 2 - Bit - Single bit - MODBUS_DATA - bi, mbbi, mbbiDirect, longin - value = (Modbus data & mask)
- (normally mask=1)
- 3, 4, 23 - 16-bit word - 16-bit word - MODBUS_DATA - bi, mbbi, mbbiDirect, longin - value = (Modbus data & mask)
- (mask selects bits of interest)
- 5 - Bit - Single bit - MODBUS_DATA - bo, mbbo, mbboDirect, longout - Modbus write (value & mask)
- (normally mask=1)
- 6 - 16-bit word - 16-bit word - MODBUS_DATA - bo, mbbo, mbboDirect, longout - If mask==0 or mask==0xFFFF does Modbus write (value)
- Else does read/modify/write:
- Sets bits that are set in value and set in mask,
- Clears bits that are clear in value and set in mask
- Any - NA - NA - ENABLE_HISTOGRAM - bi, mbbi, mbbiDirect, longin - Returns 0/1 if I/O time histogramming is disabled/enabled in driver
-
- Any - NA - NA - ENABLE_HISTOGRAM - bo, mbbo, mbboDirect, longout - If value = 0/1 then disable/enable I/O time histogramming in driver
-
-

- asynInt32

-

- asynInt32 device support is selected with -

-
field(DTYP,"asynInt32")
-field(INP,"@asyn(portName,offset,timeout)drvUser")
-    
-

- or

-
field(INP,"@asynMask(portName,offset,nbits,timeout)drvUser")
-    
-

- The asynMask syntax is used for analog I/O devices, in order to specify the number - of bits in the device. This is required for Modbus because the driver only knows - that it is returning a 16-bit register, but not the actual number of bits in the - device, and hence cannot return meaningful data with asynInt32->getBounds(). -

-

- nbits>0 for a unipolar device. For example, nbits=12 means unipolar 12-bit device, - with a range of 0 to 4095. nbits<0 for a bipolar device. For example, nbits=-12 - means bipolar 12-bit device, with a range of -2048 to 2047)

-

- Note: when writing 32-bit or 64-bit values function code 16 should be used if the - device supports it. The write will then be "atomic". If function code 6 is used - then the data will be written in multiple messages, and there will be an short time - period in which the device has incorrect data. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- asynInt32 Device Support
- Modbus function - Offset type - Data type - drvUser - Records supported - Description
- 1, 2 - Bit - Single bit - MODBUS_DATA - ai, bi, mbbi, longin - value = (epicsUInt32)Modbus data
- 3, 4, 23 - 16-bit words - 16, 32, or 64-bit word - MODBUS_DATA (or datatype-specific value) - ai, mbbi, longin - value = (epicsInt32)Modbus data
- 5 - Bit - Single bit - MODBUS_DATA - ao, bo, mbbo, longout - Modbus write value
- 6, 16, 23 - 16-bit words - 16, 32, or 64-bit word - MODBUS_DATA (or datatype-specific value) - ao, mbbo, longout - Modbus write value
- Any - NA - NA - MODBUS_READ - ao, bo, longout - Writing to a Modbus input driver with this drvUser value will force the poller thread - to run once immediately, regardless of the value of POLL_DELAY.
- Any - NA - NA - READ_OK - ai, longin - Returns number of successful read operations on this asyn port
- Any - NA - NA - WRITE_OK - ai, longin - Returns number of successful write operations on this asyn port
- Any - NA - NA - IO_ERRORS - ai, longin - Returns number of I/O errors on this asyn port
- Any - NA - NA - LAST_IO_TIME - ai, longin - Returns number of milliseconds for last I/O operation
- Any - NA - NA - MAX_IO_TIME - ai, longin - Returns maximum number of milliseconds for I/O operations
- Any - NA - NA - HISTOGRAM_BIN_TIME - ao, longout - Sets the time per bin in msec in the statistics histogram
-

- asynFloat64

-

- asynFloat64 device support is selected with

-
field(DTYP,"asynFloat64")
-field(INP,"@asyn(portName,offset,timeout)drvUser")
-

- Note: when writing 32-bit or 64-bit values function code 16 should be used if the - device supports it. The write will then be "atomic". If function code 6 is used - then the data will be written in multiple messages, and there will be an short time - period in which the device has incorrect data. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- asynFloat64 Device Support
- Modbus function - Offset type - Data type - drvUser - Records supported - Description
- 1, 2 - Bit - Single bit - MODBUS_DATA - ai - value = (epicsFloat64)Modbus data
- 3, 4, 23 - 16-bit words - 16, 32, or 64-bit word - MODBUS_DATA (or datatype-specific value) - ai - value = (epicsFloat64)Modbus data
- 5 - Bit - Single bit - MODBUS_DATA - ao - Modbus write (epicsUInt16)value
- 6, 16, 23 - 16-bit word - 16-bit word - MODBUS_DATA (or datatype-specific value) - ao - Modbus write value
- Any - NA - NA - POLL_DELAY - ai, ao - Read or write the delay time in seconds between polls for the read poller thread. - If ≤0 then the poller thread does not run periodically, it only runs when it - is woken up by an epicsEvent signal, which happens when the driver has an asynInt32 - write with the MODBUS_READ drvUser string.
-

- asynInt32Array

-

- asynInt32Array device support is selected with

-
field(DTYP,"asynInt32ArrayIn")
-field(INP,"@asyn(portName,offset,timeout)drvUser")
-    
-

- or

-
field(DTYP,"asynInt32ArrayOut")
-field(INP,"@asyn(portName,offset,timeout)drvUser")
-    
-

- asynInt32Array device support is used to read or write arrays of up to 2000 coil - values or up to 125 16-bit registers. It is also used to read the histogram array - of I/O times when histogramming is enabled. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- asynInt32Array Device Support
- Modbus function - Offset type - Data type - drvUser - Records supported - Description
- 1, 2 - Bit - Array of bits - MODBUS_DATA - waveform (input) - value = (epicsInt32)Modbus data[]
- 3, 4, 23 - 16-bit word - Array of 16, 32 or 64-bit words - MODBUS_DATA (or datatype-specific value) - waveform (input) - value = (epicsInt32)Modbus data[]
- 15 - Bit - Array of bits - MODBUS_DATA - waveform (output) - Modbus write (epicsUInt16)value[]
- 16, 23 - 16-bit word - Array of 16, 32, or 64-bit words - MODBUS_DATA (or datatype-specific value) - waveform (output) - Modbus write value[]
- Any - 32-bit word - NA - READ_HISTOGRAM - waveform (input) - Returns a histogram array of the I/O times in milliseconds since histogramming was - last enabled.
- Any - 32-bit word - NA - HISTOGRAM_TIME_AXIS - waveform (input) - Returns the time axis of the histogram data. Each element is HISTOGRAM_BIN_TIME - msec.
-

- asynOctet

-

- asynOctet device support is selected with

-
field(DTYP,"asynOctetRead")
-field(INP,"@asyn(portName,offset,timeout)drvUser")
-    
-

- or

-
field(DTYP,"asynOctetWrite")
-field(INP,"@asyn(portName,offset,timeout)drvUser")
-    
-

- asynOctet device support is used to read or write strings of up to 250 characters.

-

- Note: The 0 terminating byte at the end of the string in a waveform record or stringout - record is not written to the Modbus device.

-

- Note: On input number of characters read from the Modbus device will be the lesser - of:
- - the number of characters in the record minus the terminating 0 byte (39 for stringin, - NELM-1 for waveform) or -
- - the number of characters contained in the registers defined modbusLength argument - to drvModbusAsynConfigure (modbusLength or modbusLength*2 depending on whether the - drvUser field specifies 1 or 2 characters per register.

-

- The string will be truncated if any of the characters read from Modbus is a 0 byte, - but there is no guarantee that the last character in the string is followed by a - 0 byte in the Modbus registers. Generally either modbusLength or NELM in the waveform - record should be used to define the correct length for the string. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- asynOctet Device Support
- Modbus function - Offset type - Data type - drvUser - Records supported - Description
- 3, 4, 23 - 16-bit word - String of characters - STRING_HIGH, STRING_LOW, STRING_HIGH_LOW, or STRING_LOW_HIGH - waveform (input) or stringin - value = Modbus data[]
- 16, 23 - 16-bit word - String of characters - STRING_HIGH, STRING_LOW, STRING_HIGH_LOW, or STRING_LOW_HIGH - waveform (output) or stringout - Modbus write value[]
-

- Template files

-

- modbus provides example template files in the modbusApp/Db directory. These - include:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Template Files
- Files - Description - Macro arguments
- bi_bit.template - asynUInt32Digital support for bi record with discrete inputs or coils. Mask=1. - - P, R, PORT, OFFSET, ZNAM, ONAM, ZSV, OSV, SCAN
- bi_word.template - asynUInt32Digital support for bi record with register inputs. - P, R, PORT, OFFSET, MASK, ZNAM, ONAM, ZSV, OSV, SCAN
- mbbiDirect.template - asynUInt32Digital support for mbbiDirect record with register inputs. - P, R, PORT, OFFSET, MASK, SCAN
- longin.template - asynUInt32Digital support for longin record with register inputs. Mask=0xFFFF. - - P, R, PORT, OFFSET, SCAN
- longinInt32.template - asynInt32 support for longin record with register inputs. - P, R, PORT, OFFSET, SCAN, DATA_TYPE
- intarray_in.template - asynInt32Array support for waveform record with discrete, coil, or register inputs. - - P, R, PORT, OFFSET, NELM, SCAN
- bo_bit.template - asynUInt32Digital support for bo record with coil outputs. Mask=1. - P, R, PORT, OFFSET, ZNAM, ONAM
- bo_word.template - asynUInt32Digital support for bo record with register outputs. - P, R, PORT, OFFSET, MASK, ZNAM, ONAM
- mbboDirect.template - asynUInt32Digital support for mbboDirect record with register outputs. - P, R, PORT, OFFSET, MASK
- longout.template - asynUInt32Digital support for longout record with register outputs. Mask=0xFFFF. - - P, R, PORT, OFFSET
- longoutInt32.template - asynInt32 support for longout record with register outputs. - P, R, PORT, OFFSET, DATA_TYPE
- intarray_out.template - asynInt32Array support for waveform record with discrete, coil, or register outputs. - - P, R, PORT, OFFSET, NELM
- ai.template - asynInt32 support for ai record with LINEAR conversion - P, R, PORT, OFFSET, BITS, EGUL, EGUF, PREC, SCAN
- aiFloat64.template - asynFloat64 support for ai record - P, R, PORT, OFFSET, LOPR, HOPR, PREC, SCAN, DATA_TYPE
- ai_average.template - asynInt32Average support for ai record with LINEAR conversion. This support gets - callbacks each time the poll thread reads the analog input, and averages readings - until the record is processed. - P, R, PORT, OFFSET, BITS, EGUL, EGUF, PREC, SCAN
- ao.template - asynInt32 support for ao record with LINEAR conversion - P, R, PORT, OFFSET, BITS, EGUL, EGUF, PREC
- aoFloat64.template - asynFloat64 support for ao record - P, R, PORT, OFFSET, LOPR, HOPR, PREC, DATA_TYPE
- stringin.template - asynOctet support for stringin record - P, R, PORT, OFFSET, DATA_TYPE, SCAN
- stringout.template - asynOctet support for stringout record - P, R, PORT, OFFSET, DATA_TYPE, INITIAL_READBACK
- stringWaveformIn.template - asynOctet input support for waveform record - P, R, PORT, OFFSET, DATA_TYPE, NELM, SCAN
- stringWaveformOut.template - asynOctet output support for waveform record - P, R, PORT, OFFSET, DATA_TYPE, NELM, INITIAL_READBACK
- asynRecord.template - Support for asyn record. Useful for controlling trace printing, and for debugging. - - P, R, PORT, ADDR, TMOD, IFACE
- poll_delay.template - Support for ao record to control the delay time for the poller thread. - P, R, PORT
- poll_trigger.template - Support for bo record to trigger running the poller thread. - P, R, PORT
- statistics.template - Support for bo, longin and waveform records to read I/O statistics for the port. - - P, R, PORT, SCAN
-

- The following table explains the macro parameters used in the preceeding table. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Macro Parameters
- Macro - Description
- P - Prefix for record name. Complete record name is $(P)$(R).
- R - Record name. Complete record name is $(P)$(R).
- PORT - Port name for modbus asyn port.
- OFFSET - Offset for Modbus data relative to start address for this port.
- MASK - Bit mask used to select data for this record.
- ZNAM - String for 0 value for bi/bo records.
- ONAM - String for 1 value for bi/bo records.
- ZSV - 0 severity for bi/bo records.
- OSV - 1 severity for bi/bo records.
- BITS - Number of bits for analog I/O devices. >0=unipolar, <0=bipolar.
- DATA_TYPE - drvUser field specifying the Modbus data type. If this field is blank or is MODBUS_DATA - then the default datatype specified in the drvModbusAsynConfigure command is used. - Other allowed values are listed in the table above (UINT16, INT16SM, BCD_SIGNED, - etc.)
- EGUL - Engineering value for lower limit of analog device.
- EGUF - Engineering value for upper limit of analog device.
- LOPR - Lower display limit of analog device.
- HOPR - Upper display limit of analog device.
- PREC - Number of digits of precision for ai/ao records.
- NELM - Number of elements in waveform records.
- ADDR - Address for asyn record, same as OFFSET above.
- TMOD - Transfer mode for asyn record.
- IFACE - asyn interface for asyn record.
- SCAN - Scan rate for record (e.g. "1 second", "I/O Intr", etc.).
- INITIAL_READBACK - Controls whether an initial readback from the device is done for the stringout or - string waveform output records.
-

- Example Applications

-

- modbus builds an example application called modbusApp. This application can - be run to control any number of Modbus PLCs.

-

- In the iocBoot/iocTest directory there are several startup scripts for EPICS IOCs. - These are designed to test most of the features of the modbus driver on Koyo - PLCs, such as the DL series from Automation Direct. -

-
    -
  • Koyo1.cmd creates modbus port drivers to read the X inputs, write to the - Y outputs, and read and write from the C control registers. Each of these sets of - inputs and outputs is accessed both as coils and as registers (V memory). bi/bo, - mbbiDirect/mbboDirect, and waveform records are loaded to read and write using these - drivers.
  • -
  • Koyo2.cmd creates modbus port drivers to read the X inputs, write to the - Y outputs, and read and write from the C control registers. Only coil access is - used. This example also reads a 4-channel 13-bit bipolar A/D converter. This has - been tested using both signed-BCD and sign plus magnitude binary formats. Note that - a ladder logic program must be loaded that does the appropriate conversion of the - A/D values into V memory.
  • -
  • st.cmd is a simple example startup script to be run on non-vxWorks IOCs. It just - loads Koyo1.cmd and Koyo2.cmd. It is invoked using a command like: -
          ../../bin/linux-x86/modbusApp st.cmd
    -      
    - One can also load Koyo1.cmd or Koyo2.cmd separately as in: -
          ../../bin/linux-x86/modbusApp Koyo1.cmd
    -      
    - st.cmd.vxWorks is a simple example startup script to be run on vxWorks IOCs. It - just loads Koyo1.cmd and Koyo2.cmd.
  • -
-

- The following is the beginning of Koyo1.cmd when it is configured for serial RTU - with slave address 1 on /dev/ttyS1. It also shows how to configure TCP and serial - ASCII connections. (Koyo PLCs do not support ASCII however).

-
# Koyo1.cmd
-
-dbLoadDatabase("../../dbd/modbus.dbd")
-modbus_registerRecordDeviceDriver(pdbbase)
-
-# Use the following commands for TCP/IP
-#drvAsynIPPortConfigure(const char *portName, 
-#                       const char *hostInfo,
-#                       unsigned int priority, 
-#                       int noAutoConnect,
-#                       int noProcessEos);
-drvAsynIPPortConfigure("Koyo1","164.54.160.158:502",0,0,1)
-#modbusInterposeConfig(const char *portName, 
-#                      modbusLinkType linkType,
-#                      int timeoutMsec, 
-#                      int writeDelayMsec)
-modbusInterposeConfig("Koyo1",0,5000,0)
-
-# Use the following commands for serial RTU or ASCII
-#drvAsynSerialPortConfigure(const char *portName, 
-#                           const char *ttyName,
-#                           unsigned int priority, 
-#                           int noAutoConnect,
-#                           int noProcessEos);
-#drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0)
-#asynSetOption("Koyo1",0,"baud","38400")
-#asynSetOption("Koyo1",0,"parity","none")
-#asynSetOption("Koyo1",0,"bits","8")
-#asynSetOption("Koyo1",0,"stop","1")
-
-# Use the following command for serial RTU
-# Note: non-zero write delay (last parameter) may be needed.
-#modbusInterposeConfig("Koyo1",1,1000,0)
-
-# Use the following commands for serial ASCII
-#asynOctetSetOutputEos("Koyo1",0,"\r\n")
-#asynOctetSetInputEos("Koyo1",0,"\r\n")
-# Note: non-zero write delay (last parameter) may be needed.
-#modbusInterposeConfig("Koyo1",2,1000,0)
-
-# NOTE: We use octal numbers for the start address and length (leading zeros)
-#       to be consistent with the PLC nomenclature.  This is optional, decimal
-#       numbers (no leading zero) or hex numbers can also be used.
-#       In these examples we are using slave address 0 (number after "Koyo1").
-
-# The DL205 has bit access to the Xn inputs at Modbus offset 4000 (octal)
-# Read 32 bits (X0-X37).  Function code=2.
-drvModbusAsynConfigure("K1_Xn_Bit",      "Koyo1", 0, 2,  04000, 040,    0,  100, "Koyo")
-
-# The DL205 has word access to the Xn inputs at Modbus offset 40400 (octal)
-# Read 8 words (128 bits).  Function code=3.
-drvModbusAsynConfigure("K1_Xn_Word",     "Koyo1", 0, 3, 040400, 010,    0,  100, "Koyo")
-
-# The DL205 has bit access to the Yn outputs at Modbus offset 4000 (octal)
-# Read 32 bits (Y0-Y37).  Function code=1.
-drvModbusAsynConfigure("K1_Yn_In_Bit",   "Koyo1", 0, 1,  04000, 040,    0,  100, "Koyo")
-
-# The DL205 has bit access to the Yn outputs at Modbus offset 4000 (octal)
-# Write 32 bits (Y0-Y37).  Function code=5.
-drvModbusAsynConfigure("K1_Yn_Out_Bit",  "Koyo1", 0, 5,  04000, 040,    0,  1, "Koyo")
-
-# The DL205 has word access to the Yn outputs at Modbus offset 40500 (octal)
-# Read 8 words (128 bits).  Function code=3.
-drvModbusAsynConfigure("K1_Yn_In_Word",  "Koyo1", 0, 3, 040500, 010,    0,  100, "Koyo")
-
-# Write 8 words (128 bits).  Function code=6.
-drvModbusAsynConfigure("K1_Yn_Out_Word", "Koyo1", 0, 6, 040500, 010,    0,  100, "Koyo")
-
-# The DL205 has bit access to the Cn bits at Modbus offset 6000 (octal)
-# Access 256 bits (C0-C377) as inputs.  Function code=1.
-drvModbusAsynConfigure("K1_Cn_In_Bit",   "Koyo1", 0, 1,  06000, 0400,   0,  100, "Koyo")
-
-# Access the same 256 bits (C0-C377) as outputs.  Function code=5.
-drvModbusAsynConfigure("K1_Cn_Out_Bit",  "Koyo1", 0, 5,  06000, 0400,   0,  1,  "Koyo")
-
-# Access the same 256 bits (C0-C377) as array outputs.  Function code=15.
-drvModbusAsynConfigure("K1_Cn_Out_Bit_Array",  "Koyo1", 0, 15,  06000, 0400,   0,   1, "Koyo")
-
-# The DL205 has word access to the Cn bits at Modbus offset 40600 (octal)
-# We use the first 16 words (C0-C377) as inputs (256 bits).  Function code=3.
-drvModbusAsynConfigure("K1_Cn_In_Word",  "Koyo1", 0, 3, 040600, 020,    0,  100, "Koyo")
-
-# We access the same 16 words (C0-C377) as outputs (256 bits). Function code=6.
-drvModbusAsynConfigure("K1_Cn_Out_Word", "Koyo1", 0, 6, 040600, 020,    0,  1,  "Koyo")
-
-# We access the same 16 words (C0-C377) as array outputs (256 bits). Function code=16.
-drvModbusAsynConfigure("K1_Cn_Out_Word_Array", "Koyo1", 0, 16, 040600, 020,    0,   1, "Koyo")
-
-# Enable ASYN_TRACEIO_HEX on octet server
-asynSetTraceIOMask("Koyo1",0,4)
-# Enable ASYN_TRACE_ERROR and ASYN_TRACEIO_DRIVER on octet server
-#asynSetTraceMask("Koyo1",0,9)
-
-# Enable ASYN_TRACEIO_HEX on modbus server
-asynSetTraceIOMask("K1_Yn_In_Bit",0,4)
-# Enable all debugging on modbus server
-#asynSetTraceMask("K1_Yn_In_Bit",0,255)
-# Dump up to 512 bytes in asynTrace
-asynSetTraceIOTruncateSize("K1_Yn_In_Bit",0,512)
-
-dbLoadTemplate("Koyo1.substitutions")
-
-iocInit
-
-

- Note that this example is designed for testing and demonstration purposes, not as - a realistic example of how modbus would normally be used. For example, it - loads 6 drivers to access the C control relays using function codes 1 (read coils), - 3 (read holding registers), 5 (write single coil), 6 (write single holding register), - 15 (write multiple coils), and 16 (write multiple holding registers). This allows - for testing of all function codes and record types, including waveforms. In practice - one would normally only load at most 2 drivers for the C control relays, for example - function code 1 (read coils), and function code 5 (write single coil).

-

- There are other example applications in the iocTest directory, sim*.cmd and sim*.substitutions. - These examples are used for testing the different Modbus data types and other features. - I have used them with the Modbus - Slave program, which is an inexpensive Modbus slave emulator.

-

- medm screens

-

- modbus provides example medm .adl files in the modtcpApp/op/adl directory. - The following are screen shots of these screens from an IOC controlling a Koyo DL205 - PLC.

-
-
-

- Koyo1.adl

-

- Top level medm screen for the Koyo1 example application.

- Koyo1.png -
-
-
-

- Koyo_8inputs.adl

-

- Inputs X0-X7 read as discrete inputs (function code 1).

- K1_Xn_Bit.png -
-
-
-

- Koyo_8outputs.adl

-

- Outputs Y0-Y7 written using register access (function code 6).

- K1_Yn_Out_Word.png -
-
-
-

- Koyo_8outputs.adl

-

- Outputs C200-C207 written using bit access (function code 5).

- K1_C20n_Out_Bit.png -
-
-
-

- Koyo_8inputs.adl

-

- Inputs C200-C207 read as register inputs (function code 6).

- K1_C20n_In_Word.png -
-
-
-

- modbusArray.adl

-

- Inputs C0-C377 read using a waveform record and coil access (function code 1).

- K1_Cn_In_Bit_Array.png -
-
-
-

- modbusArray.adl

-

- Inputs C0-C377 read using a waveform record and register access (function code 3).

- K1_Cn_In_Word_Array.png -
-
-
-

- modbusStatistics.adl

-

- I/O statistics for the Modbus driver that is reading inputs X0-X37 using register - access (function code 3). The histogram is the number of events versus TCP/IP write/read - cycle time in msec.

- K1_Xn_Bit_Statistics.png -
-
-
-

- Koyo2.adl

-

- Top level medm screen for the Koyo2 example application.

- Koyo2.png -
-
-
-

- Koyo_4ADC.adl

-

- 4 ADC inputs from a 13-bit bipolar ADC.

- K2_ADCs.png -
-

- Debug tracing

-

- One can obtain diagnostic output for a modbus port driver using the "dbior" - or "asynPrint" commands at the iocsh or vxWorks shell. "asynReport" with no arguments - will print a brief report for all asyn drivers, including the drvAsynIPPort or drvAsynSerialPort - driver that modbus drivers are connected to, and for all modbus port - drivers. For example, a partial output for the Koyo1 application when it is connected - via TCP is:

-
epics> asynReport
-Koyo1 multiDevice:No canBlock:Yes autoConnect:No
-Port 164.54.160.158:502: Connected
-K1_Xn_Bit multiDevice:Yes canBlock:No autoConnect:Yes
-    addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 1 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 2 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 3 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 4 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 5 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 6 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    addr 7 autoConnect Yes enabled Yes connected Yes exceptionActive No
-modbus port: K1_Xn_Bit
-K1_Xn_Word multiDevice:Yes canBlock:No autoConnect:Yes
-    addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No
-
-

- To obtain more detailed information, one can request information for a specific - modbus port driver, and output level >0 as follows:

-
epics> asynReport 5, "K1_Xn_Word"
-K1_Xn_Word multiDevice:Yes canBlock:No autoConnect:Yes
-    enabled:Yes connected:Yes numberConnects 1
-    nDevices 1 nQueued 0 blocked:No
-    asynManagerLock:No synchronousLock:No
-    exceptionActive:No exceptionUsers 0 exceptionNotifys 0
-    interfaceList
-        asynCommon pinterface 0x4001d180 drvPvt 0x8094f78
-        asynDrvUser pinterface 0x4001d10c drvPvt 0x8094f78
-        asynUInt32Digital pinterface 0x4001d118 drvPvt 0x8094f78
-        asynInt32 pinterface 0x4001d134 drvPvt 0x8094f78
-        asynFloat64 pinterface 0x4001d148 drvPvt 0x8094f78
-        asynInt32Array pinterface 0x4001d158 drvPvt 0x8094f78
-    addr 0 autoConnect Yes enabled Yes connected Yes exceptionActive No
-    exceptionActive No exceptionUsers 1 exceptionNotifys 0
-    blocked No
-modbus port: K1_Xn_Word
-    asyn TCP server:    Koyo1
-    modbusFunction:     3
-    modbusStartAddress: 040400
-    modbusLength:       010
-    plcType:            Koyo
-    I/O errors:         0
-    Read OK:            5728
-    Write OK:           0
-    pollDelay:          0.100000
-    Time for last I/O   3 msec
-    Max. I/O time:      12 msec
-
-

- To obtain run-time debugging output for a driver use the asynSetTraceMask and asynSetTraceIOMask - commands. For example the following commands will show all I/O to and from the PLC - from the underlying drvAsynIPPort driver:

-
epics> asynSetTraceIOMask "Koyo1",0,4   # Enable traceIOHex
-epics> asynSetTraceMask "Koyo1",0,9     # Enable traceError and traceIODriver
-epics> 
-2007/04/12 17:27:45.384 164.54.160.158:502 write 12
-
-00 01 00 00 00 07 ff 02 08 00 00 20 
-2007/04/12 17:27:45.390 164.54.160.158:502 read 13
-
-00 01 00 00 00 07 ff 02 04 00 00 00 00 
-2007/04/12 17:27:45.424 164.54.160.158:502 write 12
-
-00 01 00 00 00 07 ff 03 41 00 00 08 
-2007/04/12 17:27:45.432 164.54.160.158:502 read 25
-
-00 01 00 00 00 13 ff 03 10 00 00 00 00 00 00 00 00 00 00 00 
-00 00 00 00 00 
-...
-epics> asynSetTraceMask "Koyo1",0,1    # Turn off traceIODriver
-
-

- The following command shows the I/O from a specific modbus port driver:

-
epics> asynSetTraceIOMask "K1_Yn_In_Word",0,4   # Enable traceIOHex
-epics> asynSetTraceMask "K1_Yn_In_Word",0,9     # Enable traceError and traceIODriver
-epics> 
-2007/04/12 17:32:31.548 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS
-09 00 00 00 00 00 00 00 
-2007/04/12 17:32:31.656 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS
-09 00 00 00 00 00 00 00 
-2007/04/12 17:32:31.770 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS
-09 00 00 00 00 00 00 00 
-2007/04/12 17:32:31.878 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS
-09 00 00 00 00 00 00 00 
-2007/04/12 17:32:31.987 drvModbusAsyn::doModbusIO port K1_Yn_In_Word READ_REGISTERS
-09 00 00 00 00 00 00 00 
-epics> asynSetTraceMask "K1_Yn_In_Word",0,1     # Disable traceIODriver
-
-

- One can also load an EPICS asyn record on a modbus port, and then use EPICS - channel access to turn debugging output on and off. The following medm screen shows - how to turn on I/O tracing using this method.

-
-
-

- asynRecord.adl

-

- Using the asynRecord to turn on traceIODriver and traceIOHex for debugging.

- K1_Yn_In_Word.png -
-

- The asyn record can also be used to perform actual I/O to the PLC. For example the - following screen shots shows the asyn record being used to control output Y1 on - a PLC. Note that the ADDR field is set to 1 (to select Y1) and the data set to 1 - (to turn on the output). Each time the asyn record is processed the value will be - sent to the PLC.

-
-
-

- asynRecord.adl

-

- Using the asynRecord to perform actual I/O to a PLC. Note that Address (ADDR)=1.

- K1_Yn_Out_Bit_Asyn.png -
-
-
-

- asynRegister.adl

-

- Using the asynRecord to perform actual I/O to a PLC. Note that Interface (IFACE)=asynUInt32Digital, - Transfer (TMOD)=Write, and Output (UI32OUT)=1. This value will be written to the - Y1 output when the record is processed.

- K1_Yn_Out_Bit_AsynRegister.png -
-

- Differences from Triumf modtcp and plctcp package

-

- The following are the main enhancements of modbus compared to the modtcp - and plctcp packages from Triumf:

-
    -
  • modbus supports serial RTU and serial ASCII in addition to TCP. modtcp - supports only TCP.
  • -
  • modbus supports most Modbus function codes, including 1, 2, 5, and 15 for - reading and writing coils (single bits) and 3, 4, 6, and 16 for reading and writing - registers. modtcp supports only Modbus functions 3 (read holding register) and 6 - (write holding register).
  • -
  • modbus supports pseudo-interrupt mode on inputs. The poller thread calls - device support when there is a new value, so the EPICS records can have SCAN=I/O - Intr and do not need to periodically read the inputs. This is more efficient.
  • -
  • modbus supports array operations on reads and writes using waveform records.
  • -
  • modbus uses asyn for underlying TCP/IP connections. This reduces the amount - of code, and has good debugging and connection management.
  • -
  • modbus uses standard asyn interfaces and asyn device support. This reduces - the amount of code significantly.
  • -
  • modbus should run on all EPICS platforms. It has been tested on linux-x86, - vxWorks, win32-x86 (native Windows with VC++ compiler), and cygwin-x86 (Windows - with gcc compiler and Cygwin library). modtcp only works on Linux and vxWorks.
  • -
  • modbus provides EPICS PVs for PLC status and statistics.
  • -
-

- The following are some drawbacks of modbus compared to the modtcp and plctcp - packages from Triumf:

-
    -
  • modbus only works on EPICS 3.14, not on 3.13.
  • -
  • There is no Siemens PLC support. It should be a separate driver, using drvModbusAsyn.c - as a model. Most code in modbus is Modbus specific, so it is cleaner to write - a separate, but similar driver for other protocols.
  • -
  • modbus has one thread per asyn port, which is a group of Modbus registers - or coils. This is more threads than modtcp, which had only 1 thread per PLC. There - is an advantage in the modbus design, because each can poll at a different - rate, can have different Modbus function code, and a different data type. It also - allows much finer granularity in debugging output. But it will lead to somewhat - increased resource usage compared to the modtcp design.
  • -
-

- Known problems

-
    -
  • No known problems at this time.
  • -
- - diff --git a/documentation/modbusReleaseNotes.html b/documentation/modbusReleaseNotes.html deleted file mode 100644 index 885a3cc..0000000 --- a/documentation/modbusReleaseNotes.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - modbus: Modbus Support - Release Notes - - - -
-

- modbus: Modbus Support - Release Notes

-
-
-

- Release 2-10-1

-

- September 15, 2017

-
-
    -
  • Previously the Modbus/TCP transaction ID was set to 1 on writes and ignored on - reads. Now the Modbus transaction ID is incremented by 1 on each message sent by - the driver. On the reply the driver waits until a message with the correct transaction - ID is received, ignoring messages with any other transaction ID. This is more robust, - especially for Modbus/UDP links. Thanks to Eric Norum for this.
  • -
-
-

- Release 2-10

-

- September 15, 2017

-
-
    -
  • Added an epicsAtExit handler which stops the poller task. This eliminates error - messages from the poller task when the IOC exits.
  • -
  • Greatly reduced the number of error messages printed when there are communication - errors or timeouts with the Modbus device. Previously error messages were printed - for each asyn port on each poller loop. Now, there is a single message per port - when an error condition is detected, and a single message when the error condition - ends. For example this is the output from a Koyo PLC with 3 drvModbusAsyn input - ports that are polling at 10 Hz. The drvAsynIPPort has the asynOption "disconnectOnReadTimeout" - set to "Y" set so that it reconnects quickly when the network is reconnected. The - Ethernet cable was unplugged for about 8 seconds and then plugged back in. -
    2017/09/12 13:14:25.764 drvModbusAsyn::doModbusIO port K1_Xn_Bit error calling writeRead, error=164.54.160.197:502 read error: S_errno_EWOULDBLOCK, nwrite=6/6, nread=0
    -2017/09/12 13:14:25.781 drvModbusAsyn::doModbusIO port K1_Yn_In_Bit error calling writeRead, error=asynManager::queueLockPort queueRequest timed out, nwrite=0/6, nread=0
    -2017/09/12 13:14:25.814 drvModbusAsyn::doModbusIO port K1_Cn_In_Bit error calling writeRead, error=asynManager::queueLockPort queueRequest timed out, nwrite=0/6, nread=0
    -2017/09/12 13:14:33.564 drvModbusAsyn::doModbusIO port K1_Xn_Bit writeRead status back to normal nwrite=6/6, nread=6
    -2017/09/12 13:14:33.581 drvModbusAsyn::doModbusIO port K1_Yn_In_Bit writeRead status back to normal nwrite=6/6, nread=6
    -2017/09/12 13:14:33.614 drvModbusAsyn::doModbusIO port K1_Cn_In_Bit writeRead status back to normal nwrite=6/6, nread=34
    -
    - The first error message indicates that the K1_Xn_Bit driver got a timeout when reading - the device. That timeout causes drvAsynIPPort driver to disconnect the port because - of the asynOption described above. The next 2 errors are from the other two ports - which get queueRequest timeouts because the port is now disconnected. When the network - cable is reconnected each of the ports prints a "status back to normal" message.
  • -
  • The example IOC startup scripts now call asynSetOption("disconnectOnReadTimeout", - "Y"). for TCP ports. This ensures much faster reconnection when the Modbus device - comes back online if it disconnects. Note that for this to work asyn R4-32 or later - is needed, because of a needed fix to asynManager::queueLockPort(), which is used - by the asynXXXSyncIO functions.
  • -
-
-

- Release 2-9

-

- August 23, 2016

-
-
    -
  • Added support for specifying absolute Modbus addresses in the asyn "addr" field. - Previously each driver was limited to addressing at most 125 registers (read operations) - or 123 registers (write operations), and the asyn "addr" field specified an offset - relative to the modbusStartAddress passed as the fifth argument to drvAsynModbusConfigure(). - Now if the modbusStartAddress=-1 then the driver will use absolute addressing, and - the asyn "addr" specifies the absolute Modbus address in the range 0 to 65535. In - this case the modbusLength argument to drvAsynModbusConfigure() is the maximum length - required for any single Modbus transaction by that driver. This would be 1 if all - Modbus reads and writes are for 16-bit registers, but it would be 4 if 64-bit floats - (4 16-bit registers) are being used, and 100 (for example) if an Int32 waveform - record with NELM=100 and a 16-bit Modbus data type is being read or written.
  • -
  • Added support for strings using the asynOctet interface. Some vendors use Modbus - for string data. The Modbus standard does not specify how strings should be stored, - and different vendors do it differently. The driver supports 4 new Modbus data types, - using the following drvInfo strings: -
      -
    • STRING_HIGH One character is stored in the high byte of each register.
    • -
    • STRING_LOW One character is stored in the low byte of each register.
    • -
    • STRING_HIGH_LOW Two characters are stored in each register, the first in the high - byte and the second in the low byte.
    • -
    • STRING_LOW_HIGH Two characters are stored in each register, the first in the low - byte and the second in the high byte.
    • -
    - The standard asynOctet device support is used. This supports stringout, stringin, - and waveform records. Waveform records can be used for either input or output. The - stringin and stringout records are limited to 40 characters strings, while waveform - records are limited only by the 125/123 register limit of Modbus for read/write - operatations i.e. up to 250 characters.
  • -
  • Added error checking to make sure the length of the reply from the Modbus server - is the expected value. Previously garbled communications could cause a crash because - of array bounds violation.
  • -
-
-

- Release 2-8

-

- February 11, 2016

-
-
    -
  • Improved the logic in the poller thread. -
      -
    • Previously there was a call to epicsThreadSleep at the end of the poller loop. - This meant that the poller always ran at least once, which might not be desirable. - It also meant that one could only temporarily disable the poller by calling pasynManager->lockPort(), - or to make it run infrequently by setting POLL_DELAY to a long sleep time. In R2-5 - the MODBUS_READ command was added. However, this just did a read operation without - triggering the poller thread, so records with I/O Intr scan would not process. It - also required disabling the poller thread with pasynManager->LockPort.
    • -
    • The poller thread has been changed so that it calls epicsEventWait or epicsEventWaitWithTimeout - at the beginning of the poller loop. If the POLL_DELAY is >0 then it calls epicsEventWaitWithTimeout, - using the POLL_DELAY as the timeout. If POLL_DELAY is ≤0 then it calls epicsEventWait, - with no timeout. This allows the poller to be suspended indefinitely and only run - when the epicsEvent is signaled. It also means if POLL_DELAY ≤0 then the poller - does not run at all until the epicsEvent is signaled. The MODBUS_READ command now - signals the epicsEvent to trigger the poller, rather than directly doing a read - operation.
    • -
    • Added a new template file, poll_trigger.template which loads a record with the - MODBUS_READ drvInfo string to trigger the poller.
    • -
    -
  • -
  • Fixed problems when using waveform records with the asynInt32Array interface. -
      -
    • If the Modbus data type was not UINT16 or INT16 then the data were not read into - the waveform record correctly. This bug has been fixed, and new files iocBoot/iocTest/array_test.cmd - and array_test.substitions were added to test it using the Modbus Slave Simulator. - New adl files, modbusTestArray.adl and array_test.adl were added for these tests. - modbusTestArray.adl also contains controls for POLL_DELAY and POLL_TRIGGER to verify - the improvements to the poller thread above.
    • -
    • Previously the first element in the waveform record was always the first register - in that modbus driver, i.e. it did not allow specifying a register offset using - the asyn ADDR address. This was improved so now one can specify an offset using - the OFFSET macro parameter, as with the non-array records in modbus.
    • -
    -
  • -
-
-

- Release 2-7-1

-

- May 6, 2015

-
-
    -
  • Minor changes to allow building dynamically on Cygwin.
  • -
-
-

- Release 2-7

-

- August 19, 2014

-
-
    -
  • Added support for function code 23, Read/Write Multiple Registers. Because of - the architecture of the EPICS Modbus support, a driver that uses function 23 is - restricted to being either a read-only driver where no data is written, or a write-only - driver where no data is read. It is preferable to use functions codes 3, 4, 6, or - 16 if they are supported. However, some older devices only support function code - 23.
  • -
-
-

- Release 2-6

-

- April 10, 2014

-
-
    -
  • Fixed a problem with function code 6 (write single register) on Wago devices when - the MASK was not 0x0 or 0xFFFF. In this case a read/modify/write operation is required, - and the driver was reading from the wrong address. On Wago devices the readback - address for a register is offset by 0x200 from the write address. This offset was - not being applied.
  • -
  • Added 2 new records to statistics.template. $(P)$(R)HistTimeAxis is a waveform - record that contains the X time axis for histogram plots, and MsPerBin is the time - per histogram bin in msec.
  • -
-
-

- Release 2-5

-

- October 2, 2013

-
-
    -
  • Fixed a mutex issue with the input poller. Previous versions had a potential problem - with input records which did not use Scan=I/O Intr. In this case there was no mutex - protecting access to the read buffer between the device support thread and the poller - thread that was reading the Modbus data. It is likely that this problem was rarely - if ever encountered because input records were almost always I/O Intr scanned. The - fix was to remove the existing mutex in the driver and to simply call pasynManager->lockPort() - for the entire duration of the polling cycle. This fix has a positive side effect: - it is now possible for external clients, for example other drivers that call the - Modbus driver, to temporarily disable the poller by calling pasynManager->lockPort(). - This can be used to allow atomic sequences of Modbus read/write operations with - no possibility of interference from the poller.
  • -
  • The above fix means that Modbus input drivers can now block on read operations, - because they may need to wait for the poller to complete. These drivers are thus - now created with the ASYN_CANBLOCK flag, and the documentation has been changed - to state that input drivers are now asynchronous, not synchronous.
  • -
  • Changed the wait for interruptAccept in the poller thread. It now works to have - a very long polling time, but still having one initial read cycle and callback on - I/O Intr scanned records.
  • -
  • Added a new command to the Modbus driver, which has the drvUser string "MODBUS_READ". - This command is implemented on the asynInt32 interface. Calling asynInt32->write() - with this command causes a Modbus I/O cycle for this driver. It will typically be - used to force a Modbus input driver to do a read operation independent of the poller - thread.
  • -
  • Added a new test driver called testModbusSyncIO.cpp. This driver is derived from - asynPortDriver. It is designed to demonstrate using another asyn driver to communicate - through the Modbus driver. This concept is currently being used to have a motor - driver that communicates through the Modbus driver. It demonstrates two types of - communication: -
      -
    1. Using pasynInt32SyncIO calls to make "synchronous" calls to the Modbus driver. - These calls are blocking and are queued.
    2. -
    3. Doing an atomic "read/modify/write" cycle using the following sequence of operations. - This uses pasynManager->lockPort to disable the poller and allow this thread to - directly call the asynInt32->write() and asynInt32->read() functions. It uses the - following logic: -
        -
      • Lock the output port. Needed because we are directly calling the write() function.
      • -
      • Lock the input port, which disables the poller and because we are directly calling - read().
      • -
      • Sleep for 1 second so we can prove the poller was idle.
      • -
      • Force a read of the Modbus input by writing on asynInt32 interface with the MODBUS_READ - drvInfo.
      • -
      • Read the input value on the asynInt32 interface.
      • -
      • Add the value passed to this function to the current value just read.
      • -
      • Sleep for 2 seconds so we can prove the poller was idle.
      • -
      • Write the new value to the output driver.
      • -
      • Unlock the input port.
      • -
      • Unlock the output port.
      • -
      - This new example driver can be tested with the new files iocBoot/iocTest/sim3.cmd - and sim3.substitutions.
    4. -
    -
  • -
  • Minor change to structure packing declarations to allow building on ARM architecture - with GCC 4.2.1
  • -
-
-

- Release 2-4

-

- May 22, 2012

-
-
    -
  • Improved support for different Modbus data types. -
      -
    • Added support for 7 new Modbus data types: -
        -
      • 16-bit signed integer
      • -
      • 32-bit integer, little-endian
      • -
      • 32-bit integer, big-endian
      • -
      • 32-bit float, little-endian
      • -
      • 32-bit float, big-endian
      • -
      • 64-bit float, little-endian
      • -
      • 64-bit float, big-endian
      • -
      -
    • -
    • Added support to allow the Modbus data type to be specified on a per-record bas - using the asyn drvUser field. Previously all records connected to a Modbus asyn - port driver had the same Modbus data type, because each Modbus port driver was limited - to a single data type.
    • -
    • If the drvUser string in the link specification is omitted, or if it is the default - of MODBUS_DATA then the record will use the modbusDataType defined in drvModbusAsynConfigure. - This is backwards compatible, and existing IOCs will continue to work with no changes - to databases or startup scripts.
    • -
    • Added new example IOC script, substitutions file, and medm screens to test all - data types. The testing was done with a Modbus slave simulator.
    • -
    -
  • -
  • Added special treatment for Wago devices. These device are different from other - Modbus devices because the address to read back a register is not the same as the - address to write the register. The readback address is the write address plus 0x200. - This means that in previous versions of this driver the initial readback value for - Modbus write operations to Wago devices was incorrect. This was fixed by adding - the 0x200 offset to the readback address if the plcType argument to drvModbusAsynConfigure - contains the substring "Wago" (case sensitive).
  • -
  • Added support for passing status information back to device support in callbacks - for I/O Intr scanned records. Support for this was added in asyn R4-19. This means - that if the Modbus device communications returns errors that I/O Intr scanned records - will now have their alarm status set correctly.
  • -
-
-

- Release 2-3

-

- Sept 9, 2011

-
-
    -
  • build changes
  • -
  • added .opi files for CSS-BOY
  • -
-
-

- Release 2-2

-

- March 13, 2011

-
-
    -
  • R2-0 introduced a 20 ms delay before each Modbus write. This was not correct, - delays should only be needed for serial RTU. The Modicon Modbus Protocol Reference - Guide says this must be at least 3.5 character times, e.g. about 3.5ms at 9600 baud, - for Serial RTU. An additional writeDelayMsec parameter was added to modbusInterposeConfig. - It is the final parameter, so if it is not specified the default value is zero, - which is appropriate when not using Serial RTU. In the startup script lines like - the following: -
    -    modbusInterposeConfig("Koyo1",0,5000)
    -    
    - should be changed to: -
    -    modbusInterposeConfig("Koyo1",0,5000,0)
    -    
    - for no delay, or to: -
    -    modbusInterposeConfig("Koyo1",0,5000,20)
    -    
    - for a 20 ms delay.
  • -
-
-

- Release 2-1

-

- November 7, 2010

-
-
    -
  • Bug fix. Non-automatic connection to the Modbus server uses pasynCommonSyncIO->connectDevice(). - The pasynUser being used for that operation was being created with pasynOctetSyncIO->connect(). - That was always an error, it must be created with pasynCommonSyncIO->connect(). - This error became serious with asyn R4-14, and non-automatic connection no longer - worked.
  • -
  • Previous releases of modbus recommended setting NoAutoConnect=1 when configuring - the TCP or serial port. That was probably because of problems in connection management - in earlier versions of asyn. With asyn R4-14 this is no longer necessary, and NoAutoConnect=0, - the normal default, can be used with no problems. The example scripts Koyo1.cmd - and Koyo2.cmd in the iocBoot directory have been changed to enable automatic connection - to the IP or serial driver.
  • -
-
-

- Release 2-0

-

- November 26, 2009

-
-
    -
  • Moved the slave address handling from the asynInterpose layer to the Modbus driver - layer. This was done because handing it in the the interpose layer only allowed - 1 slave address per asyn serial port or IP port. This did not allow a single serial - port to be used with multiple Modbus devices on an RS-485 bus, for example. NOTE: - This requires all startup command scripts to be changed, because the syntax of the - modbusInterposeConfig and drvModbusAsynConfigure commands has changed. Thanks - to Yves Lussignol from CEA in France for making these changes.
  • -
-
-

- Release 1-3

-

- September 19, 2008

-
-
    -
  • Changed modbusInterpose.c to replace pasynOctet->writeRaw() and pasynOctet->readRaw() - with pasynOctet->write() and pasynOctet->read(), because the raw routines have been - removed in asyn R4-10.
  • -
  • Changed the driver to use the asynStandardInterfaces interfaces added to asyn - in R4-10.
  • -
-
-

- Release 1-2

-

- September 6, 2007

-
-
    -
  • Fixed bug in computing byteCount in WRITE_MULTIPLE_COILS function code.
  • -
-

- There is a known limitation with using serial interfaces. It is not currently possible - to have multiple Modbus servers connected to a single serial port. This is a limitation - of the asynInterposeInterface architecture used. It is fixed in release 2-0.

-
-

- Release 1-1

-

- April 30, 2007

-
-

- Initial release of modbus module.

- - diff --git a/iocBoot/iocTest/Koyo1.cmd b/iocBoot/iocTest/Koyo1.cmd index 36b292f..3c47ed0 100644 --- a/iocBoot/iocTest/Koyo1.cmd +++ b/iocBoot/iocTest/Koyo1.cmd @@ -1,7 +1,9 @@ # Koyo1.cmd -dbLoadDatabase("../../dbd/modbus.dbd") -modbus_registerRecordDeviceDriver(pdbbase) +< envPaths + +dbLoadDatabase("../../dbd/modbusApp.dbd") +modbusApp_registerRecordDeviceDriver(pdbbase) # Use the following commands for TCP/IP #drvAsynIPPortConfigure(const char *portName, @@ -9,7 +11,7 @@ modbus_registerRecordDeviceDriver(pdbbase) # unsigned int priority, # int noAutoConnect, # int noProcessEos); -drvAsynIPPortConfigure("Koyo1","164.54.160.158:502",0,0,1) +drvAsynIPPortConfigure("Koyo1","164.54.160.158:502",0,0,0) asynSetOption("Koyo1",0, "disconnectOnReadTimeout", "Y") m#modbusInterposeConfig(const char *portName, # modbusLinkType linkType, diff --git a/iocBoot/iocTest/Koyo2.cmd b/iocBoot/iocTest/Koyo2.cmd index 2e3a6de..ea6bb82 100644 --- a/iocBoot/iocTest/Koyo2.cmd +++ b/iocBoot/iocTest/Koyo2.cmd @@ -1,7 +1,7 @@ # Koyo2.cmd -dbLoadDatabase("../../dbd/modbus.dbd") -modbus_registerRecordDeviceDriver(pdbbase) +dbLoadDatabase("../../dbd/modbusApp.dbd") +modbusApp_registerRecordDeviceDriver(pdbbase) # Use the following commands for TCP/IP #drvAsynIPPortConfigure(const char *portName, @@ -9,7 +9,7 @@ modbus_registerRecordDeviceDriver(pdbbase) # unsigned int priority, # int noAutoConnect, # int noProcessEos); -drvAsynIPPortConfigure("Koyo2","164.54.160.158:502",0,0,1) +drvAsynIPPortConfigure("Koyo2","164.54.160.158:502",0,0,0) asynSetOption("Koyo2",0, "disconnectOnReadTimeout", "Y") #modbusInterposeConfig(const char *portName, # modbusLinkType linkType, diff --git a/iocBoot/iocTest/Koyo_Sim1.cmd b/iocBoot/iocTest/Koyo_Sim1.cmd new file mode 100644 index 0000000..25fec56 --- /dev/null +++ b/iocBoot/iocTest/Koyo_Sim1.cmd @@ -0,0 +1,113 @@ +# Koyo_Sim1.cmd + +# This is very similar to Koyo1.cmd. There are 2 differences in the addressing: +# - The Koyo hardware has the X inputs and Y outputs at the same address (04000) +# We use 02000 for X and 04000 for Y to make it clearer in the simulator +# - The Koyo hardware has bit and word access at different addresses for the same bits. +# The Modbus Slave simulator from Witte software cannot do that, so we use the same addresses for bit and word access. + +< envPaths + +dbLoadDatabase("../../dbd/modbusApp.dbd") +modbusApp_registerRecordDeviceDriver(pdbbase) + +# Use the following commands for TCP/IP +#drvAsynIPPortConfigure(const char *portName, +# const char *hostInfo, +# unsigned int priority, +# int noAutoConnect, +# int noProcessEos); +drvAsynIPPortConfigure("Koyo1","camaro:502",0,0,0) +asynSetOption("Koyo1",0, "disconnectOnReadTimeout", "Y") +m#modbusInterposeConfig(const char *portName, +# modbusLinkType linkType, +# int timeoutMsec, +# int writeDelayMsec) +modbusInterposeConfig("Koyo1",0,5000,0) + +# Use the following commands for serial RTU or ASCII +#drvAsynSerialPortConfigure(const char *portName, +# const char *ttyName, +# unsigned int priority, +# int noAutoConnect, +# int noProcessEos); +#drvAsynSerialPortConfigure("Koyo1", "/dev/ttyS1", 0, 0, 0) +#asynSetOption("Koyo1",0,"baud","38400") +#asynSetOption("Koyo1",0,"parity","none") +#asynSetOption("Koyo1",0,"bits","8") +#asynSetOption("Koyo1",0,"stop","1") + +# Use the following command for serial RTU +# Note: non-zero write del1ay (last parameter) may be needed. +#modbusInterposeConfig("Koyo1",1,1000,0) + +# Use the following commands for serial ASCII +#asynOctetSetOutputEos("Koyo1",0,"\r\n") +#asynOctetSetInputEos("Koyo1",0,"\r\n") +# Note: non-zero write delay (last parameter) may be needed. +#modbusInterposeConfig("Koyo1",2,1000,0) + +# NOTE: We use octal numbers for the start address and length (leading zeros) +# to be consistent with the PLC nomenclature. This is optional, decimal +# numbers (no leading zero) or hex numbers can also be used. +# In these examples we are using slave address 0 (number after "Koyo1"). + +# Bit access to the Xn inputs at Modbus offset 4000 (octal) +# Read 32 bits (X0-X37). Function code=2. +drvModbusAsynConfigure("K1_Xn_Bit", "Koyo1", 0, 2, 02000, 040, 0, 100, "Koyo") + +# Word access to the Xn inputs at Modbus offset 2000 (octal) +# Read 8 words (128 bits). Function code=3. +drvModbusAsynConfigure("K1_Xn_Word", "Koyo1", 0, 3, 02000, 010, 0, 100, "Koyo") + +# Bit access to the Yn outputs at Modbus offset 4000 (octal) +# Read 32 bits (Y0-Y37). Function code=1. +drvModbusAsynConfigure("K1_Yn_In_Bit", "Koyo1", 0, 1, 04000, 040, 0, 100, "Koyo") + +# Bit access to the Yn outputs at Modbus offset 4000 (octal) +# Write 32 bits (Y0-Y37). Function code=5. +drvModbusAsynConfigure("K1_Yn_Out_Bit", "Koyo1", 0, 5, 04000, 040, 0, 1, "Koyo") + +# Word access to the Yn outputs at Modbus offset 4000 (octal) +# Read 8 words (128 bits). Function code=3. +drvModbusAsynConfigure("K1_Yn_In_Word", "Koyo1", 0, 3, 04000, 010, 0, 100, "Koyo") + +# Write 8 words (128 bits). Function code=6. +drvModbusAsynConfigure("K1_Yn_Out_Word", "Koyo1", 0, 6, 04000, 010, 0, 100, "Koyo") + +# Bit access to the Cn bits at Modbus offset 6000 (octal) +# Access 256 bits (C0-C377) as inputs. Function code=1. +drvModbusAsynConfigure("K1_Cn_In_Bit", "Koyo1", 0, 1, 06000, 0400, 0, 100, "Koyo") + +# Access the same 256 bits (C0-C377) as outputs. Function code=5. +drvModbusAsynConfigure("K1_Cn_Out_Bit", "Koyo1", 0, 5, 06000, 0400, 0, 1, "Koyo") + +# Access the same 256 bits (C0-C377) as array outputs. Function code=15. +drvModbusAsynConfigure("K1_Cn_Out_Bit_Array", "Koyo1", 0, 15, 06000, 0400, 0, 1, "Koyo") + +# Word access to the Cn bits at Modbus offset 6000 (octal) +# We use the first 16 words (C0-C377) as inputs (256 bits). Function code=3. +drvModbusAsynConfigure("K1_Cn_In_Word", "Koyo1", 0, 3, 06000, 020, 0, 100, "Koyo") + +# We access the same 16 words (C0-C377) as outputs (256 bits). Function code=6. +drvModbusAsynConfigure("K1_Cn_Out_Word", "Koyo1", 0, 6, 06000, 020, 0, 1, "Koyo") + +# We access the same 16 words (C0-C377) as array outputs (256 bits). Function code=16. +drvModbusAsynConfigure("K1_Cn_Out_Word_Array", "Koyo1", 0, 16, 06000, 020, 0, 1, "Koyo") + +# Enable ASYN_TRACEIO_HEX on octet server +asynSetTraceIOMask("Koyo1",0,4) +# Enable ASYN_TRACE_ERROR and ASYN_TRACEIO_DRIVER on octet server +#asynSetTraceMask("Koyo1",0,9) + +# Enable ASYN_TRACEIO_HEX on modbus server +asynSetTraceIOMask("K1_Yn_In_Bit",0,4) +# Enable all debugging on modbus server +#asynSetTraceMask("K1_Yn_In_Bit",0,255) +# Dump up to 512 bytes in asynTrace +asynSetTraceIOTruncateSize("K1_Yn_In_Bit",0,512) + +dbLoadTemplate("Koyo1.substitutions") + +iocInit + diff --git a/iocBoot/iocTest/ModbusF1_A0_128bits.mbs b/iocBoot/iocTest/ModbusF1_A0_128bits.mbs new file mode 100644 index 0000000000000000000000000000000000000000..26ffe0babf3703f04066b5d4a7ed0efbc864340c GIT binary patch literal 157748 zcmeI)K}y3w6adg)MRDN`ir@iUc?;K4aOtMF^Z;%|Jb=gYM(&J%5<3x@5+W)^-{2%6 zZ79C}|1+6{UM(Z8V`z(9-DfXrjQ{}x1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXFY!g^)d%=DJ1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U_*H?k_fIRo z6W4uece(F4`^iDX!(K%G_3bd1=h+|k+x(HJGzW@ z+{A4zPh%Aqk^9Pf9h(TO#D-ibAnuQ zAMg2tfAOqF8HSWTH}4(S9=~znk}*)*)U{x~QT{dV+i{UcHHmUV9;p+p`4V+PotRT6 z%yW%eQ#F+pt0K^P{O32oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF#2XSb BP<#LY literal 0 HcmV?d00001 diff --git a/iocBoot/iocTest/ModbusF3_A100_80words.mbs b/iocBoot/iocTest/ModbusF3_A100_80words.mbs new file mode 100644 index 0000000000000000000000000000000000000000..6128083d4a917d546159c5defe58fca9acd26bcb GIT binary patch literal 150102 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 B6x{#- literal 0 HcmV?d00001 diff --git a/iocBoot/iocTest/array_test.cmd b/iocBoot/iocTest/array_test.cmd index d26b116..669f6fa 100644 --- a/iocBoot/iocTest/array_test.cmd +++ b/iocBoot/iocTest/array_test.cmd @@ -1,7 +1,7 @@ < envPaths -dbLoadDatabase("../../dbd/modbus.dbd") -modbus_registerRecordDeviceDriver(pdbbase) +dbLoadDatabase("../../dbd/modbusApp.dbd") +modbusApp_registerRecordDeviceDriver(pdbbase) # Use the following commands for TCP/IP #drvAsynIPPortConfigure(const char *portName, @@ -9,7 +9,7 @@ modbus_registerRecordDeviceDriver(pdbbase) # unsigned int priority, # int noAutoConnect, # int noProcessEos); -drvAsynIPPortConfigure("sim1","164.54.160.31:502",0,0,1) +drvAsynIPPortConfigure("sim1","164.54.160.31:502",0,0,0) asynSetOption("sim1",0, "disconnectOnReadTimeout", "Y") #modbusInterposeConfig(const char *portName, # modbusLinkType linkType, diff --git a/iocBoot/iocTest/sim1.substitutions b/iocBoot/iocTest/sim1.substitutions deleted file mode 100644 index dbc3092..0000000 --- a/iocBoot/iocTest/sim1.substitutions +++ /dev/null @@ -1,151 +0,0 @@ -# asyn record for the underlying asyn octet port -file "$(ASYN)/db/asynRecord.db" { pattern -{P, R, PORT, ADDR, IMAX, OMAX} -{SIM1: OctetAsyn, sim1, 0, 80, 80} -} - -# These are the A0 inputs done with bit access -file "../../db/bi_bit.template" { pattern -{P, R, PORT, OFFSET, ZNAM, ONAM, ZSV, OSV, SCAN} -{SIM1:, BI0B, A0_In_Bits, 0, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI1B, A0_In_Bits, 1, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI2B, A0_In_Bits, 2, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI3B, A0_In_Bits, 3, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI4B, A0_In_Bits, 4, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI5B, A0_In_Bits, 5, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI6B, A0_In_Bits, 6, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -{SIM1:, BI7B, A0_In_Bits, 7, Low, High, NO_ALARM, MAJOR, "I/O Intr"} -} -file "../../db/mbbiDirect.template" { pattern -{P, R, PORT, OFFSET, MASK, SCAN} -{SIM1:, MBBID0, A0_In_Bits, 0, 0xFFFF, "I/O Intr"} -} -file "../../db/intarray_in.template" { pattern -{P, R, PORT, NELM, SCAN} -{SIM1:, BIArray, A0_In_Bits, 32, "I/O Intr"} -} -file "../../db/asynRecord.template" { pattern -{P, R, PORT, ADDR, TMOD, IFACE} -{SIM1:, BIAsyn, A0_In_Bits, 0, Read, asynUInt32Digital} -} -file "../../db/statistics.template" { pattern -{P, R, PORT, SCAN} -{SIM1:, BI, A0_In_Bits, "10 second"} -} -file "../../db/poll_delay.template" { pattern -{P, R, PORT} -{SIM1:, BIPollDelay, A0_In_Bits} -} - -# These are the A0 outputs done with bit access. -file "../../db/bo_bit.template" { pattern -{P, R, PORT, OFFSET, ZNAM, ONAM} -{SIM1:, BO0B, A0_Out_Bits, 0, Low, High} -{SIM1:, BO1B, A0_Out_Bits, 1, Low, High} -{SIM1:, BO2B, A0_Out_Bits, 2, Low, High} -{SIM1:, BO3B, A0_Out_Bits, 3, Low, High} -{SIM1:, BO4B, A0_Out_Bits, 4, Low, High} -{SIM1:, BO5B, A0_Out_Bits, 5, Low, High} -{SIM1:, BO6B, A0_Out_Bits, 6, Low, High} -{SIM1:, BO7B, A0_Out_Bits, 7, Low, High} -} -file "../../db/mbboDirect.template" { pattern -{P, R, PORT, OFFSET, MASK} -{SIM1:, MBBOD0, A0_Out_Bits, 0, 0xFFFF} -} -file "../../db/asynRecord.template" { pattern -{P, R, PORT, ADDR, TMOD, IFACE} -{SIM1:, BOAsyn, A0_Out_Bits, 0, Read, asynUInt32Digital} -} -file "../../db/statistics.template" { pattern -{P, R, PORT, SCAN} -{SIM1:, BO, A0_Out_Bits, "10 second"} -} -file "../../db/poll_delay.template" { pattern -{P, R, PORT} -{SIM1:, BOPollDelay, A0_Out_Bits} -} - - - -# These are the A0 inputs done with word access -file "../../db/longinInt32.template" { pattern -{P, R, PORT, OFFSET, DATA_TYPE, SCAN} -{SIM1:, LI:UINT16, A0_In_Word, 0, UINT16, "I/O Intr"} -{SIM1:, LI:BCD_UNSIGNED, A0_In_Word, 1, BCD_UNSIGNED, "I/O Intr"} -{SIM1:, LI:BCD_SIGNED, A0_In_Word, 2, BCD_SIGNED, "I/O Intr"} -{SIM1:, LI:INT16, A0_In_Word, 3, INT16, "I/O Intr"} -{SIM1:, LI:INT32_LE, A0_In_Word, 4, INT32_LE, "I/O Intr"} -{SIM1:, LI:INT32_BE, A0_In_Word, 6, INT32_BE, "I/O Intr"} -{SIM1:, LI:FLOAT32_LE, A0_In_Word, 8, FLOAT32_LE, "I/O Intr"} -{SIM1:, LI:FLOAT32_BE, A0_In_Word, 10, FLOAT32_BE, "I/O Intr"} -{SIM1:, LI:FLOAT64_LE, A0_In_Word, 12, FLOAT64_LE, "I/O Intr"} -{SIM1:, LI:FLOAT64_BE, A0_In_Word, 16, FLOAT64_BE, "I/O Intr"} -{SIM1:, LI:DEFAULT, A0_In_Word, 20, "", "I/O Intr"} -} - -# These are the A0 outputs done with word access. -file "../../db/longoutInt32.template" { pattern -{P, R, PORT, OFFSET, DATA_TYPE} -{SIM1:, LO:UINT16, A0_Out_Word, 0, UINT16} -{SIM1:, LO:BCD_UNSIGNED, A0_Out_Word, 1, BCD_UNSIGNED} -{SIM1:, LO:BCD_SIGNED, A0_Out_Word, 2, BCD_SIGNED} -{SIM1:, LO:INT16, A0_Out_Word, 3, INT16} -{SIM1:, LO:INT32_LE, A0_Out_Word, 4, INT32_LE} -{SIM1:, LO:INT32_BE, A0_Out_Word, 6, INT32_BE} -{SIM1:, LO:FLOAT32_LE, A0_Out_Word, 8, FLOAT32_LE} -{SIM1:, LO:FLOAT32_BE, A0_Out_Word, 10, FLOAT32_BE} -{SIM1:, LO:FLOAT64_LE, A0_Out_Word, 12, FLOAT64_LE} -{SIM1:, LO:FLOAT64_BE, A0_Out_Word, 16, FLOAT64_BE} -{SIM1:, LO:DEFAULT, A0_Out_Word, 20, ""} -} - -file "../../db/aiFloat64.template" { pattern -{P, R, PORT, OFFSET, DATA_TYPE, LOPR, HOPR, PREC, SCAN} -{SIM1:, AI:UINT16, A0_In_Word, 30, UINT16, -1e6, 1e6, 0, "I/O Intr"} -{SIM1:, AI:BCD_UNSIGNED, A0_In_Word, 31, BCD_UNSIGNED, -1e6, 1e6, 0, "I/O Intr"} -{SIM1:, AI:BCD_SIGNED, A0_In_Word, 32, BCD_SIGNED, -1e6, 1e6, 0, "I/O Intr"} -{SIM1:, AI:INT16, A0_In_Word, 33, INT16, -1e6, 1e6, 0, "I/O Intr"} -{SIM1:, AI:INT32_LE, A0_In_Word, 34, INT32_LE, -1e6, 1e6, 0, "I/O Intr"} -{SIM1:, AI:INT32_BE, A0_In_Word, 36, INT32_BE, -1e6, 1e6, 0, "I/O Intr"} -{SIM1:, AI:FLOAT32_LE, A0_In_Word, 38, FLOAT32_LE, -1e6, 1e6, 3, "I/O Intr"} -{SIM1:, AI:FLOAT32_BE, A0_In_Word, 40, FLOAT32_BE, -1e6, 1e6, 3, "I/O Intr"} -{SIM1:, AI:FLOAT64_LE, A0_In_Word, 42, FLOAT64_LE, -1e6, 1e6, 3, "I/O Intr"} -{SIM1:, AI:FLOAT64_BE, A0_In_Word, 46, FLOAT64_BE, -1e6, 1e6, 3, "I/O Intr"} -{SIM1:, AI:DEFAULT, A0_In_Word, 50, "" , -1e6, 1e6, 3, "I/O Intr"} -} - -file "../../db/aoFloat64.template" { pattern -{P, R, PORT, OFFSET, DATA_TYPE, LOPR, HOPR, PREC} -{SIM1:, AO:UINT16, A0_Out_Word, 30, UINT16, -1e6, 1e6, 0} -{SIM1:, AO:BCD_UNSIGNED, A0_Out_Word, 31, BCD_UNSIGNED, -1e6, 1e6, 0} -{SIM1:, AO:BCD_SIGNED, A0_Out_Word, 32, BCD_SIGNED, -1e6, 1e6, 0} -{SIM1:, AO:INT16, A0_Out_Word, 33, INT16, -1e6, 1e6, 0} -{SIM1:, AO:INT32_LE, A0_Out_Word, 34, INT32_LE, -1e6, 1e6, 0} -{SIM1:, AO:INT32_BE, A0_Out_Word, 36, INT32_BE, -1e6, 1e6, 0} -{SIM1:, AO:FLOAT32_LE, A0_Out_Word, 38, FLOAT32_LE, -1e6, 1e6, 3} -{SIM1:, AO:FLOAT32_BE, A0_Out_Word, 40, FLOAT32_BE, -1e6, 1e6, 3} -{SIM1:, AO:FLOAT64_LE, A0_Out_Word, 42, FLOAT64_LE, -1e6, 1e6, 3} -{SIM1:, AO:FLOAT64_BE, A0_Out_Word, 46, FLOAT64_BE, -1e6, 1e6, 3} -{SIM1:, AO:DEFAULT, A0_Out_Word, 50, "", -1e6, 1e6, 3} -} - -file "../../db/asynRecord.template" { pattern -{P, R, PORT, ADDR, TMOD, IFACE} -{SIM1:, A0:AsynIn, A0_In_Word, 0, Read, asynInt32} -} - -file "../../db/asynRecord.template" { pattern -{P, R, PORT, ADDR, TMOD, IFACE} -{SIM1:, A0:AsynOut, A0_Out_Word, 0, Read, asynInt32} -} - -file "../../db/statistics.template" { pattern -{P, R, PORT, SCAN} -{SIM1:, A0:, A0_In_Word, "10 second"} -} - -file "../../db/poll_delay.template" { pattern -{P, R, PORT} -{SIM1:, A0:PollDelay, A0_In_Word} -} diff --git a/iocBoot/iocTest/sim2.cmd b/iocBoot/iocTest/sim2.cmd index 076678f..2bb2fad 100644 --- a/iocBoot/iocTest/sim2.cmd +++ b/iocBoot/iocTest/sim2.cmd @@ -1,7 +1,7 @@ # simulator.cmd -dbLoadDatabase("../../dbd/modbus.dbd") -modbus_registerRecordDeviceDriver(pdbbase) +dbLoadDatabase("../../dbd/modbusApp.dbd") +modbusApp_registerRecordDeviceDriver(pdbbase) # Use the following commands for TCP/IP #drvAsynIPPortConfigure(const char *portName, @@ -9,7 +9,7 @@ modbus_registerRecordDeviceDriver(pdbbase) # unsigned int priority, # int noAutoConnect, # int noProcessEos); -drvAsynIPPortConfigure("sim1","164.54.160.31:502",0,0,1) +drvAsynIPPortConfigure("sim1","164.54.160.31:502",0,0,0) asynSetOption("sim1",0, "disconnectOnReadTimeout", "Y") #modbusInterposeConfig(const char *portName, # modbusLinkType linkType, diff --git a/iocBoot/iocTest/sim3.cmd b/iocBoot/iocTest/sim3.cmd index 3bd28a3..70ec005 100644 --- a/iocBoot/iocTest/sim3.cmd +++ b/iocBoot/iocTest/sim3.cmd @@ -2,8 +2,8 @@ /db # databases, templates, substitutions like this -DB += bi_word.template -DB += bo_word.template -DB += bi_bit.template -DB += bo_bit.template -DB += longin.template -DB += longout.template -DB += longinInt32.template -DB += longoutInt32.template -DB += mbbiDirect.template -DB += mbboDirect.template -DB += ai.template -DB += ai_average.template -DB += ao.template -DB += aiFloat64.template -DB += aoFloat64.template -DB += intarray_in.template -DB += intarray_out.template -DB += stringin.template -DB += stringout.template -DB += stringWaveformIn.template -DB += stringWaveformOut.template -DB += statistics.template -DB += asynRecord.template -DB += poll_delay.template -DB += poll_trigger.template +DB += $(patsubst ../%, %, $(wildcard ../*.template)) +REQ += $(patsubst ../%, %, $(wildcard ../*.req)) #---------------------------------------------------- # If .db template is not named *.template add diff --git a/modbusApp/Db/aiFloat64.template b/modbusApp/Db/aiFloat64.template index 8b012f9..8e5d5ff 100644 --- a/modbusApp/Db/aiFloat64.template +++ b/modbusApp/Db/aiFloat64.template @@ -2,9 +2,9 @@ record(ai, "$(P)$(R)") { field(DTYP,"asynFloat64") field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)") - field(HOPR,"$(HOPR)") - field(LOPR,"$(LOPR)") - field(PREC,"$(PREC)") - field(SCAN,"$(SCAN)") + field(HOPR,"$(HOPR=0)") + field(LOPR,"$(LOPR=0)") + field(PREC,"$(PREC=0)") + field(SCAN,"$(SCAN=I/O Intr)") } diff --git a/modbusApp/Db/ai_average.template b/modbusApp/Db/ai_average.template index cb2c1e8..1c1450d 100644 --- a/modbusApp/Db/ai_average.template +++ b/modbusApp/Db/ai_average.template @@ -3,11 +3,11 @@ record(ai, "$(P)$(R)") { field(DTYP,"asynInt32Average") field(INP,"@asynMask($(PORT) $(OFFSET) $(BITS))MODBUS_DATA") field(LINR,"LINEAR") - field(EGUL,"$(EGUL)") - field(EGUF,"$(EGUF)") - field(HOPR,"$(EGUF)") - field(LOPR,"$(EGUL)") - field(PREC,"$(PREC)") + field(EGUL,"$(EGUL=0)") + field(EGUF,"$(EGUF=0)") + field(HOPR,"$(EGUF=0)") + field(LOPR,"$(EGUL=0)") + field(PREC,"$(PREC=0)") field(SCAN,"$(SCAN)") } diff --git a/modbusApp/Db/aoFloat64.template b/modbusApp/Db/aoFloat64.template index 6d22111..11e6ae6 100644 --- a/modbusApp/Db/aoFloat64.template +++ b/modbusApp/Db/aoFloat64.template @@ -2,8 +2,8 @@ record(ao, "$(P)$(R)") { field(DTYP,"asynFloat64") field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)") - field(HOPR,"$(HOPR)") - field(LOPR,"$(LOPR)") - field(PREC,"$(PREC)") + field(HOPR,"$(HOPR=0)") + field(LOPR,"$(LOPR=0)") + field(PREC,"$(PREC=0)") } diff --git a/modbusApp/Db/int64in.template b/modbusApp/Db/int64in.template new file mode 100644 index 0000000..21950b3 --- /dev/null +++ b/modbusApp/Db/int64in.template @@ -0,0 +1,6 @@ +# int64in record template for register inputs +record(int64in,"$(P)$(R)") { + field(DTYP,"asynInt64") + field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)") + field(SCAN, "$(SCAN)") +} diff --git a/modbusApp/Db/int64out.template b/modbusApp/Db/int64out.template new file mode 100644 index 0000000..ad00cc8 --- /dev/null +++ b/modbusApp/Db/int64out.template @@ -0,0 +1,5 @@ +# int64out record template for register inputs +record(int64out,"$(P)$(R)") { + field(DTYP,"asynInt64") + field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)") +} diff --git a/modbusApp/Db/longoutInt32.template b/modbusApp/Db/longoutInt32.template index dcb9d0b..9f5b0f1 100644 --- a/modbusApp/Db/longoutInt32.template +++ b/modbusApp/Db/longoutInt32.template @@ -2,4 +2,5 @@ record(longout,"$(P)$(R)") { field(DTYP,"asynInt32") field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)") + field(PINI,"$(PINI=NO)") } diff --git a/modbusApp/Makefile b/modbusApp/Makefile index 10e0126..971c67f 100644 --- a/modbusApp/Makefile +++ b/modbusApp/Makefile @@ -4,5 +4,6 @@ DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *src*)) DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Src*)) DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *db*)) DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Db*)) +DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *op*)) include $(TOP)/configure/RULES_DIRS diff --git a/modbusApp/op/Makefile b/modbusApp/op/Makefile new file mode 100644 index 0000000..c0b8a1e --- /dev/null +++ b/modbusApp/op/Makefile @@ -0,0 +1,12 @@ +TOP = ../.. +include $(TOP)/configure/CONFIG + +ADL_DIR = adl +UI_DIR = ui/autoconvert +EDL_DIR = edl/autoconvert +OPI_DIR = opi/autoconvert +BOB_DIR = bob/autoconvert + +include $(CONFIG)/RULES_DIRS + +-include $(SUPPORT)/configure/RULES_OPI diff --git a/modbusApp/op/adl/modbusDataTypes.adl b/modbusApp/op/adl/modbusDataTypes.adl index b279000..cac0794 100644 --- a/modbusApp/op/adl/modbusDataTypes.adl +++ b/modbusApp/op/adl/modbusDataTypes.adl @@ -1,14 +1,14 @@ file { name="/home/epics/devel/modbus/modbusApp/op/adl/modbusDataTypes.adl" - version=030105 + version=030109 } display { object { - x=580 - y=420 - width=840 - height=450 + x=331 + y=120 + width=725 + height=880 } clr=14 bclr=4 @@ -89,7 +89,7 @@ display { } text { object { - x=294 + x=236 y=12 width=252 height=25 @@ -102,13 +102,13 @@ text { } "text entry" { object { - x=360 - y=372 + x=291 + y=818 width=50 height=20 } control { - chan="$(P)A0:PollDelay" + chan="$(P)$(OUT)PollDelay" clr=14 bclr=51 } @@ -117,8 +117,8 @@ text { } text { object { - x=415 - y=375 + x=346 + y=821 width=90 height=15 } @@ -130,33 +130,33 @@ text { } "related display" { object { - x=357 - y=397 + x=288 + y=843 width=53 height=20 } display[0] { label="asynRecord Out" name="asynRecord.adl" - args="P=$(P), R=A0:AsynOut" + args="P=$(P), R=$(OUT)AsynOut" } display[1] { label="asynRecord In" name="asynRecord.adl" - args="P=$(P), R=A0:AsynIn" + args="P=$(P), R=$(OUT)AsynIn" } display[2] { label="I/O Statistics" name="modbusStatistics.adl" - args="P=$(P), R=A0:" + args="P=$(P), R=$(OUT)" } clr=14 bclr=51 } text { object { - x=415 - y=400 + x=346 + y=846 width=36 height=15 } @@ -168,8 +168,8 @@ text { } menu { object { - x=729 - y=83 + x=617 + y=85 width=100 height=20 } @@ -179,222 +179,2419 @@ menu { bclr=4 } } +"text update" { + object { + x=377 + y=88 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT16" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=85 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)UINT16" + clr=14 + bclr=51 + } + limits { + } +} +text { + object { + x=73 + y=88 + width=54 + height=15 + } + "basic attribute" { + clr=14 + } + textix="UInt16" + align="horiz. right" +} +"text update" { + object { + x=457 + y=88 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT16.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=88 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT16.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=88 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT16.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=88 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT16.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=110 + width=100 + height=20 + } + control { + chan="$(P)$(IN)BCD_UNSIGNED.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=113 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)BCD_UNSIGNED" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=110 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)BCD_UNSIGNED" + clr=14 + bclr=51 + } + limits { + } +} +text { + object { + x=37 + y=113 + width=90 + height=15 + } + "basic attribute" { + clr=14 + } + textix="UInt16 BCD" + align="horiz. right" +} +"text update" { + object { + x=457 + y=113 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)BCD_UNSIGNED.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=113 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)BCD_UNSIGNED.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=113 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)BCD_UNSIGNED.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=113 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)BCD_UNSIGNED.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=135 + width=100 + height=20 + } + control { + chan="$(P)$(IN)BCD_SIGNED.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=138 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)BCD_SIGNED" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=135 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)BCD_SIGNED" + clr=14 + bclr=51 + } + limits { + } +} +text { + object { + x=46 + y=138 + width=81 + height=15 + } + "basic attribute" { + clr=14 + } + textix="Int16 BCD" + align="horiz. right" +} +"text update" { + object { + x=457 + y=138 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)BCD_SIGNED.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=138 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)BCD_SIGNED.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=138 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)BCD_SIGNED.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=138 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)BCD_SIGNED.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=185 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT16.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=188 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT16" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=185 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT16" + clr=14 + bclr=51 + } + limits { + } +} +text { + object { + x=82 + y=188 + width=45 + height=15 + } + "basic attribute" { + clr=14 + } + textix="Int16" + align="horiz. right" +} +"text update" { + object { + x=457 + y=188 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT16.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=188 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT16.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=188 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT16.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=188 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT16.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=210 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT32_LE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=213 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_LE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=210 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT32_LE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=213 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=213 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=213 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=213 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=235 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT32_LE_BS.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=238 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_LE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=235 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT32_LE_BS" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=238 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=238 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=238 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=238 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=285 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT32_BE_BS.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=288 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_BE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=285 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT32_BE_BS" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=288 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=288 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=288 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=288 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=260 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT32_BE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=263 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_BE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=260 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT32_BE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=263 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=263 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT32_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=263 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=263 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT32_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=310 + width=100 + height=20 + } + control { + chan="$(P)$(IN)UINT32_LE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=313 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_LE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=310 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)UINT32_LE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=313 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=313 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=313 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=313 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=335 + width=100 + height=20 + } + control { + chan="$(P)$(IN)UINT32_LE_BS.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=338 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_LE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=335 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)UINT32_LE_BS" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=338 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=338 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=338 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=338 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=385 + width=100 + height=20 + } + control { + chan="$(P)$(IN)UINT32_BE_BS.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=388 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_BE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=385 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)UINT32_BE_BS" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=388 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=388 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=388 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=388 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=360 + width=100 + height=20 + } + control { + chan="$(P)$(IN)UINT32_BE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=363 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_BE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=360 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)UINT32_BE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=363 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=363 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT32_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=363 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=363 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT32_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=410 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT64_LE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=413 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_LE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=410 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT64_LE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=413 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=413 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=413 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=413 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=435 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT64_LE_BS.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=438 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_LE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=435 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT64_LE_BS" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=438 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=438 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=438 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=438 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=485 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT64_BE_BS.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=488 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_BE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=485 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT64_BE_BS" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=488 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=488 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=488 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=488 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=460 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT64_BE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=463 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_BE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=460 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT64_BE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=463 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=463 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)INT64_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=463 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=463 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)INT64_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +menu { + object { + x=617 + y=510 + width=100 + height=20 + } + control { + chan="$(P)$(IN)UINT64_LE.SCAN" + clr=14 + bclr=4 + } +} +"text update" { + object { + x=377 + y=513 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_LE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=510 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)UINT64_LE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=513 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=513 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=513 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=513 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_LE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} menu { object { - x=729 - y=108 + x=617 + y=535 width=100 height=20 } control { - chan="$(P)$(IN)BCD_UNSIGNED.SCAN" + chan="$(P)$(IN)UINT64_LE_BS.SCAN" clr=14 bclr=4 } } -menu { +"text update" { object { - x=729 - y=133 - width=100 + x=377 + y=538 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_LE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=535 + width=80 height=20 } control { - chan="$(P)$(IN)BCD_SIGNED.SCAN" + chan="$(P)$(OUT)UINT64_LE_BS" clr=14 - bclr=4 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=538 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=538 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=538 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_LE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=538 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_LE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } } menu { object { - x=729 - y=158 + x=617 + y=585 width=100 height=20 } control { - chan="$(P)$(IN)INT16.SCAN" + chan="$(P)$(IN)UINT64_BE_BS.SCAN" clr=14 bclr=4 } } -menu { +"text update" { object { - x=729 - y=183 - width=100 + x=377 + y=588 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_BE_BS" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=585 + width=80 height=20 } control { - chan="$(P)$(IN)INT32_LE.SCAN" + chan="$(P)$(OUT)UINT64_BE_BS" clr=14 - bclr=4 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=588 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=588 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=588 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_BE_BS.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=297 + y=588 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_BE_BS.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } } menu { object { - x=729 - y=208 + x=617 + y=560 width=100 height=20 } control { - chan="$(P)$(IN)INT32_BE.SCAN" + chan="$(P)$(IN)UINT64_BE.SCAN" clr=14 bclr=4 } } -menu { +"text update" { object { - x=729 - y=233 - width=100 + x=377 + y=563 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_BE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { + } +} +"text entry" { + object { + x=132 + y=560 + width=80 height=20 } - control { - chan="$(P)$(IN)FLOAT32_LE.SCAN" - clr=14 - bclr=4 + control { + chan="$(P)$(OUT)UINT64_BE" + clr=14 + bclr=51 + } + limits { + } +} +"text update" { + object { + x=457 + y=563 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=537 + y=563 + width=75 + height=15 + } + monitor { + chan="$(P)$(IN)UINT64_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { + } +} +"text update" { + object { + x=217 + y=563 + width=75 + height=15 + } + monitor { + chan="$(P)$(OUT)UINT64_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } } -menu { +"text update" { object { - x=729 - y=258 - width=100 - height=20 + x=297 + y=563 + width=75 + height=15 } - control { - chan="$(P)$(IN)FLOAT32_BE.SCAN" - clr=14 - bclr=4 + monitor { + chan="$(P)$(OUT)UINT64_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } } menu { object { - x=729 - y=283 + x=617 + y=610 width=100 height=20 } control { - chan="$(P)$(IN)FLOAT64_LE.SCAN" + chan="$(P)$(IN)FLOAT32_LE.SCAN" clr=14 bclr=4 } } -menu { +"text update" { object { - x=729 - y=308 - width=100 - height=20 + x=377 + y=613 + width=75 + height=15 } - control { - chan="$(P)$(IN)FLOAT64_BE.SCAN" - clr=14 - bclr=4 + monitor { + chan="$(P)$(IN)FLOAT32_LE" + clr=53 + bclr=2 + } + align="horiz. right" + limits { } } -menu { +"text entry" { object { - x=729 - y=333 - width=100 + x=132 + y=610 + width=80 height=20 } control { - chan="$(P)$(IN)DEFAULT.SCAN" + chan="$(P)$(OUT)FLOAT32_LE" clr=14 - bclr=4 - } -} -text { - object { - x=744 - y=59 - width=70 - height=20 + bclr=51 } - "basic attribute" { - clr=14 + limits { } - textix="Scan" - align="horiz. centered" } "text update" { object { - x=489 - y=86 + x=457 + y=613 width=75 height=15 } monitor { - chan="$(P)$(IN)UINT16" + chan="$(P)$(IN)FLOAT32_LE.STAT" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } "text update" { object { - x=489 - y=111 + x=537 + y=613 width=75 height=15 } monitor { - chan="$(P)$(IN)BCD_UNSIGNED" + chan="$(P)$(IN)FLOAT32_LE.SEVR" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } "text update" { object { - x=489 - y=136 + x=217 + y=613 width=75 height=15 } monitor { - chan="$(P)$(IN)BCD_SIGNED" + chan="$(P)$(OUT)FLOAT32_LE.STAT" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } "text update" { object { - x=489 - y=161 + x=297 + y=613 width=75 height=15 } monitor { - chan="$(P)$(IN)INT16" + chan="$(P)$(OUT)FLOAT32_LE.SEVR" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } +menu { + object { + x=617 + y=635 + width=100 + height=20 + } + control { + chan="$(P)$(IN)FLOAT32_LE_BS.SCAN" + clr=14 + bclr=4 + } +} "text update" { object { - x=489 - y=186 + x=377 + y=638 width=75 height=15 } monitor { - chan="$(P)$(IN)INT32_LE" + chan="$(P)$(IN)FLOAT32_LE_BS" clr=53 bclr=2 } @@ -402,79 +2599,111 @@ text { limits { } } +"text entry" { + object { + x=132 + y=635 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)FLOAT32_LE_BS" + clr=14 + bclr=51 + } + limits { + } +} "text update" { object { - x=489 - y=211 + x=457 + y=638 width=75 height=15 } monitor { - chan="$(P)$(IN)INT32_BE" + chan="$(P)$(IN)FLOAT32_LE_BS.STAT" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } "text update" { object { - x=489 - y=236 + x=537 + y=638 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT32_LE" + chan="$(P)$(IN)FLOAT32_LE_BS.SEVR" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } "text update" { object { - x=489 - y=261 + x=217 + y=638 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT32_BE" + chan="$(P)$(OUT)FLOAT32_LE_BS.STAT" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } "text update" { object { - x=489 - y=286 + x=297 + y=638 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT64_LE" + chan="$(P)$(OUT)FLOAT32_LE_BS.SEVR" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } +menu { + object { + x=617 + y=660 + width=100 + height=20 + } + control { + chan="$(P)$(IN)FLOAT32_BE.SCAN" + clr=14 + bclr=4 + } +} "text update" { object { - x=489 - y=311 + x=377 + y=663 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT64_BE" + chan="$(P)$(IN)FLOAT32_BE" clr=53 bclr=2 } @@ -482,376 +2711,271 @@ text { limits { } } +"text entry" { + object { + x=132 + y=660 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)FLOAT32_BE" + clr=14 + bclr=51 + } + limits { + } +} "text update" { object { - x=489 - y=336 + x=457 + y=663 width=75 height=15 } monitor { - chan="$(P)$(IN)DEFAULT" + chan="$(P)$(IN)FLOAT32_BE.STAT" clr=53 bclr=2 } + clrmod="alarm" align="horiz. right" limits { } } -text { +"text update" { object { - x=491 - y=59 - width=70 - height=20 + x=537 + y=663 + width=75 + height=15 } - "basic attribute" { - clr=14 + monitor { + chan="$(P)$(IN)FLOAT32_BE.SEVR" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } - textix="$(IREC)" - align="horiz. centered" } -text { +"text update" { object { - x=249 - y=59 - width=70 - height=20 + x=217 + y=663 + width=75 + height=15 } - "basic attribute" { - clr=14 + monitor { + chan="$(P)$(OUT)FLOAT32_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } - textix="$(OREC)" - align="horiz. centered" } -"text entry" { +"text update" { object { - x=244 - y=83 - width=80 - height=20 + x=297 + y=663 + width=75 + height=15 } - control { - chan="$(P)$(OUT)UINT16" - clr=14 - bclr=51 + monitor { + chan="$(P)$(OUT)FLOAT32_BE.SEVR" + clr=53 + bclr=2 } + clrmod="alarm" + align="horiz. right" limits { } } -"text entry" { +menu { object { - x=244 - y=108 - width=80 + x=617 + y=685 + width=100 height=20 } control { - chan="$(P)$(OUT)BCD_UNSIGNED" + chan="$(P)$(IN)FLOAT32_BE_BS.SCAN" clr=14 - bclr=51 - } - limits { + bclr=4 } } -"text entry" { +"text update" { object { - x=244 - y=133 - width=80 - height=20 + x=377 + y=688 + width=75 + height=15 } - control { - chan="$(P)$(OUT)BCD_SIGNED" - clr=14 - bclr=51 + monitor { + chan="$(P)$(IN)FLOAT32_BE_BS" + clr=53 + bclr=2 } + align="horiz. right" limits { } } "text entry" { object { - x=244 - y=158 + x=132 + y=685 width=80 height=20 } control { - chan="$(P)$(OUT)INT16" + chan="$(P)$(OUT)FLOAT32_BE_BS" clr=14 bclr=51 } limits { } } -"text entry" { +"text update" { object { - x=244 - y=183 - width=80 - height=20 + x=457 + y=688 + width=75 + height=15 } - control { - chan="$(P)$(OUT)INT32_LE" - clr=14 - bclr=51 + monitor { + chan="$(P)$(IN)FLOAT32_BE_BS.STAT" + clr=53 + bclr=2 } + clrmod="alarm" + align="horiz. right" limits { } } -"text entry" { +"text update" { object { - x=244 - y=208 - width=80 - height=20 + x=537 + y=688 + width=75 + height=15 } - control { - chan="$(P)$(OUT)INT32_BE" - clr=14 - bclr=51 + monitor { + chan="$(P)$(IN)FLOAT32_BE_BS.SEVR" + clr=53 + bclr=2 } + clrmod="alarm" + align="horiz. right" limits { } } -"text entry" { +"text update" { object { - x=244 - y=233 - width=80 - height=20 + x=217 + y=688 + width=75 + height=15 } - control { - chan="$(P)$(OUT)FLOAT32_LE" - clr=14 - bclr=51 + monitor { + chan="$(P)$(OUT)FLOAT32_BE_BS.STAT" + clr=53 + bclr=2 } + clrmod="alarm" + align="horiz. right" limits { } } -"text entry" { +"text update" { object { - x=244 - y=258 - width=80 - height=20 + x=297 + y=688 + width=75 + height=15 } - control { - chan="$(P)$(OUT)FLOAT32_BE" - clr=14 - bclr=51 + monitor { + chan="$(P)$(OUT)FLOAT32_BE_BS.SEVR" + clr=53 + bclr=2 } + clrmod="alarm" + align="horiz. right" limits { } } -"text entry" { +menu { object { - x=244 - y=283 - width=80 + x=617 + y=710 + width=100 height=20 } control { - chan="$(P)$(OUT)FLOAT64_LE" + chan="$(P)$(IN)FLOAT64_LE.SCAN" clr=14 - bclr=51 - } - limits { + bclr=4 } } -"text entry" { +"text update" { object { - x=244 - y=308 - width=80 - height=20 + x=377 + y=713 + width=75 + height=15 } - control { - chan="$(P)$(OUT)FLOAT64_BE" - clr=14 - bclr=51 + monitor { + chan="$(P)$(IN)FLOAT64_LE" + clr=53 + bclr=2 } + align="horiz. right" limits { } } "text entry" { object { - x=244 - y=333 + x=132 + y=710 width=80 height=20 } control { - chan="$(P)$(OUT)DEFAULT" + chan="$(P)$(OUT)FLOAT64_LE" clr=14 bclr=51 } limits { } } -composite { +"text update" { object { - x=5 - y=86 - width=234 - height=265 + x=457 + y=713 + width=75 + height=15 } - "composite name"="" - children { - text { - object { - x=104 - y=86 - width=135 - height=15 - } - "basic attribute" { - clr=14 - } - textix="Unsigned 16-bit" - align="horiz. right" - } - text { - object { - x=131 - y=111 - width=108 - height=15 - } - "basic attribute" { - clr=14 - } - textix="BCD unsigned" - align="horiz. right" - } - text { - object { - x=149 - y=136 - width=90 - height=15 - } - "basic attribute" { - clr=14 - } - textix="BCD signed" - align="horiz. right" - } - text { - object { - x=122 - y=161 - width=117 - height=15 - } - "basic attribute" { - clr=14 - } - textix="Signed 16-bit" - align="horiz. right" - } - text { - object { - x=176 - y=336 - width=63 - height=15 - } - "basic attribute" { - clr=14 - } - textix="Default" - align="horiz. right" - } - text { - object { - x=23 - y=186 - width=216 - height=15 - } - "basic attribute" { - clr=14 - } - textix="32-bit int little-endian" - align="horiz. right" - } - text { - object { - x=50 - y=211 - width=189 - height=15 - } - "basic attribute" { - clr=14 - } - textix="32-bit int big-endian" - align="horiz. right" - } - text { - object { - x=5 - y=236 - width=234 - height=15 - } - "basic attribute" { - clr=14 - } - textix="32-bit float little-endian" - align="horiz. right" - } - text { - object { - x=32 - y=261 - width=207 - height=15 - } - "basic attribute" { - clr=14 - } - textix="32-bit float big-endian" - align="horiz. right" - } - text { - object { - x=5 - y=286 - width=234 - height=15 - } - "basic attribute" { - clr=14 - } - textix="64-bit float little-endian" - align="horiz. right" - } - text { - object { - x=32 - y=311 - width=207 - height=15 - } - "basic attribute" { - clr=14 - } - textix="64-bit float big-endian" - align="horiz. right" - } + monitor { + chan="$(P)$(IN)FLOAT64_LE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } } "text update" { object { - x=569 - y=86 + x=537 + y=713 width=75 height=15 } monitor { - chan="$(P)$(IN)UINT16.STAT" + chan="$(P)$(IN)FLOAT64_LE.SEVR" clr=53 bclr=2 } @@ -862,13 +2986,13 @@ composite { } "text update" { object { - x=569 - y=111 + x=217 + y=713 width=75 height=15 } monitor { - chan="$(P)$(IN)BCD_UNSIGNED.STAT" + chan="$(P)$(OUT)FLOAT64_LE.STAT" clr=53 bclr=2 } @@ -879,13 +3003,13 @@ composite { } "text update" { object { - x=569 - y=136 + x=297 + y=713 width=75 height=15 } monitor { - chan="$(P)$(IN)BCD_SIGNED.STAT" + chan="$(P)$(OUT)FLOAT64_LE.SEVR" clr=53 bclr=2 } @@ -894,32 +3018,59 @@ composite { limits { } } +menu { + object { + x=617 + y=735 + width=100 + height=20 + } + control { + chan="$(P)$(IN)FLOAT64_LE_BS.SCAN" + clr=14 + bclr=4 + } +} "text update" { object { - x=569 - y=161 + x=377 + y=738 width=75 height=15 } monitor { - chan="$(P)$(IN)INT16.STAT" + chan="$(P)$(IN)FLOAT64_LE_BS" clr=53 bclr=2 } - clrmod="alarm" align="horiz. right" limits { } } +"text entry" { + object { + x=132 + y=735 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)FLOAT64_LE_BS" + clr=14 + bclr=51 + } + limits { + } +} "text update" { object { - x=569 - y=186 + x=457 + y=738 width=75 height=15 } monitor { - chan="$(P)$(IN)INT32_LE.STAT" + chan="$(P)$(IN)FLOAT64_LE_BS.STAT" clr=53 bclr=2 } @@ -930,13 +3081,13 @@ composite { } "text update" { object { - x=569 - y=211 + x=537 + y=738 width=75 height=15 } monitor { - chan="$(P)$(IN)INT32_BE.STAT" + chan="$(P)$(IN)FLOAT64_LE_BS.SEVR" clr=53 bclr=2 } @@ -947,13 +3098,13 @@ composite { } "text update" { object { - x=569 - y=236 + x=217 + y=738 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT32_LE.STAT" + chan="$(P)$(OUT)FLOAT64_LE_BS.STAT" clr=53 bclr=2 } @@ -964,13 +3115,13 @@ composite { } "text update" { object { - x=569 - y=261 + x=297 + y=738 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT32_BE.STAT" + chan="$(P)$(OUT)FLOAT64_LE_BS.SEVR" clr=53 bclr=2 } @@ -979,27 +3130,54 @@ composite { limits { } } +menu { + object { + x=617 + y=760 + width=100 + height=20 + } + control { + chan="$(P)$(IN)FLOAT64_BE.SCAN" + clr=14 + bclr=4 + } +} "text update" { object { - x=569 - y=286 + x=377 + y=763 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT64_LE.STAT" + chan="$(P)$(IN)FLOAT64_BE" clr=53 bclr=2 } - clrmod="alarm" align="horiz. right" limits { } } +"text entry" { + object { + x=132 + y=760 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)FLOAT64_BE" + clr=14 + bclr=51 + } + limits { + } +} "text update" { object { - x=569 - y=311 + x=457 + y=763 width=75 height=15 } @@ -1015,13 +3193,13 @@ composite { } "text update" { object { - x=569 - y=336 + x=537 + y=763 width=75 height=15 } monitor { - chan="$(P)$(IN)DEFAULT.STAT" + chan="$(P)$(IN)FLOAT64_BE.SEVR" clr=53 bclr=2 } @@ -1030,28 +3208,32 @@ composite { limits { } } -text { +"text update" { object { - x=571 - y=59 - width=70 - height=20 + x=217 + y=763 + width=75 + height=15 } - "basic attribute" { - clr=14 + monitor { + chan="$(P)$(OUT)FLOAT64_BE.STAT" + clr=53 + bclr=2 + } + clrmod="alarm" + align="horiz. right" + limits { } - textix="Status" - align="horiz. centered" } "text update" { object { - x=649 - y=86 + x=297 + y=763 width=75 height=15 } monitor { - chan="$(P)$(IN)UINT16.SEVR" + chan="$(P)$(OUT)FLOAT64_BE.SEVR" clr=53 bclr=2 } @@ -1060,32 +3242,59 @@ text { limits { } } +menu { + object { + x=617 + y=785 + width=100 + height=20 + } + control { + chan="$(P)$(IN)FLOAT64_BE_BS.SCAN" + clr=14 + bclr=4 + } +} "text update" { object { - x=649 - y=111 + x=377 + y=788 width=75 height=15 } monitor { - chan="$(P)$(IN)BCD_UNSIGNED.SEVR" + chan="$(P)$(IN)FLOAT64_BE_BS" clr=53 bclr=2 } - clrmod="alarm" align="horiz. right" limits { } } +"text entry" { + object { + x=132 + y=785 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)FLOAT64_BE_BS" + clr=14 + bclr=51 + } + limits { + } +} "text update" { object { - x=649 - y=136 + x=457 + y=788 width=75 height=15 } monitor { - chan="$(P)$(IN)BCD_SIGNED.SEVR" + chan="$(P)$(IN)FLOAT64_BE_BS.STAT" clr=53 bclr=2 } @@ -1096,13 +3305,13 @@ text { } "text update" { object { - x=649 - y=161 + x=537 + y=788 width=75 height=15 } monitor { - chan="$(P)$(IN)INT16.SEVR" + chan="$(P)$(IN)FLOAT64_BE_BS.SEVR" clr=53 bclr=2 } @@ -1113,13 +3322,13 @@ text { } "text update" { object { - x=649 - y=186 + x=217 + y=788 width=75 height=15 } monitor { - chan="$(P)$(IN)INT32_LE.SEVR" + chan="$(P)$(OUT)FLOAT64_BE_BS.STAT" clr=53 bclr=2 } @@ -1130,13 +3339,13 @@ text { } "text update" { object { - x=649 - y=211 + x=297 + y=788 width=75 height=15 } monitor { - chan="$(P)$(IN)INT32_BE.SEVR" + chan="$(P)$(OUT)FLOAT64_BE_BS.SEVR" clr=53 bclr=2 } @@ -1145,32 +3354,72 @@ text { limits { } } +menu { + object { + x=617 + y=160 + width=100 + height=20 + } + control { + chan="$(P)$(IN)INT16SM.SCAN" + clr=14 + bclr=4 + } +} "text update" { object { - x=649 - y=236 + x=377 + y=163 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT32_LE.SEVR" + chan="$(P)$(IN)INT16SM" clr=53 bclr=2 } - clrmod="alarm" align="horiz. right" limits { } } +"text entry" { + object { + x=132 + y=160 + width=80 + height=20 + } + control { + chan="$(P)$(OUT)INT16SM" + clr=14 + bclr=51 + } + limits { + } +} +text { + object { + x=55 + y=163 + width=72 + height=15 + } + "basic attribute" { + clr=14 + } + textix="Int16 SM" + align="horiz. right" +} "text update" { object { - x=649 - y=261 + x=457 + y=163 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT32_BE.SEVR" + chan="$(P)$(IN)INT16SM.STAT" clr=53 bclr=2 } @@ -1181,13 +3430,13 @@ text { } "text update" { object { - x=649 - y=286 + x=537 + y=163 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT64_LE.SEVR" + chan="$(P)$(IN)INT16SM.SEVR" clr=53 bclr=2 } @@ -1198,13 +3447,13 @@ text { } "text update" { object { - x=649 - y=311 + x=217 + y=163 width=75 height=15 } monitor { - chan="$(P)$(IN)FLOAT64_BE.SEVR" + chan="$(P)$(OUT)INT16SM.STAT" clr=53 bclr=2 } @@ -1215,13 +3464,13 @@ text { } "text update" { object { - x=649 - y=336 + x=297 + y=163 width=75 height=15 } monitor { - chan="$(P)$(IN)DEFAULT.SEVR" + chan="$(P)$(OUT)INT16SM.SEVR" clr=53 bclr=2 } @@ -1232,425 +3481,495 @@ text { } text { object { - x=651 - y=59 + x=662 + y=60 + width=40 + height=20 + } + "basic attribute" { + clr=14 + } + textix="Scan" + align="horiz. centered" +} +text { + object { + x=394 + y=60 + width=70 + height=20 + } + "basic attribute" { + clr=14 + } + textix="$(IREC)" + align="horiz. centered" +} +text { + object { + x=152 + y=60 width=70 height=20 } "basic attribute" { clr=14 } + textix="$(OREC)" + align="horiz. centered" +} +text { + object { + x=479 + y=60 + width=60 + height=20 + } + "basic attribute" { + clr=14 + } + textix="Status" + align="horiz. centered" +} +text { + object { + x=549 + y=60 + width=80 + height=20 + } + "basic attribute" { + clr=14 + } + textix="Severity" + align="horiz. centered" +} +text { + object { + x=239 + y=60 + width=60 + height=20 + } + "basic attribute" { + clr=14 + } + textix="Status" + align="horiz. centered" +} +text { + object { + x=309 + y=60 + width=80 + height=20 + } + "basic attribute" { + clr=14 + } textix="Severity" align="horiz. centered" } composite { object { - x=329 - y=59 - width=155 - height=292 + x=28 + y=213 + width=99 + height=90 } "composite name"="" children { - "text update" { + text { object { - x=329 - y=86 - width=75 + x=28 + y=213 + width=72 height=15 } - monitor { - chan="$(P)$(OUT)UINT16.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int32 LE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=111 - width=75 + x=28 + y=238 + width=99 height=15 } - monitor { - chan="$(P)$(OUT)BCD_UNSIGNED.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int32 LE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=136 - width=75 + x=28 + y=288 + width=99 height=15 } - monitor { - chan="$(P)$(OUT)BCD_SIGNED.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int32 BE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=161 - width=75 + x=28 + y=263 + width=72 height=15 } - monitor { - chan="$(P)$(OUT)INT16.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int32 BE" align="horiz. right" - limits { - } } - "text update" { + } +} +composite { + object { + x=19 + y=313 + width=108 + height=90 + } + "composite name"="" + children { + text { object { - x=329 - y=186 - width=75 + x=19 + y=338 + width=108 height=15 } - monitor { - chan="$(P)$(OUT)INT32_LE.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt32 LE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=211 - width=75 + x=19 + y=388 + width=108 height=15 } - monitor { - chan="$(P)$(OUT)INT32_BE.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt32 BE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=236 - width=75 + x=19 + y=363 + width=81 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT32_LE.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt32 BE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=261 - width=75 + x=19 + y=313 + width=81 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT32_BE.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt32 LE" align="horiz. right" - limits { - } } - "text update" { + } +} +composite { + object { + x=28 + y=413 + width=99 + height=90 + } + "composite name"="" + children { + text { object { - x=329 - y=286 - width=75 + x=28 + y=413 + width=72 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT64_LE.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int64 LE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=311 - width=75 + x=28 + y=438 + width=99 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT64_BE.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int64 LE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=329 - y=336 - width=75 + x=28 + y=488 + width=99 height=15 } - monitor { - chan="$(P)$(OUT)DEFAULT.STAT" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Int64 BE BS" align="horiz. right" - limits { - } } text { object { - x=331 - y=59 - width=70 - height=20 + x=28 + y=463 + width=72 + height=15 } "basic attribute" { clr=14 } - textix="Status" - align="horiz. centered" + textix="Int64 BE" + align="horiz. right" } - "text update" { + } +} +composite { + object { + x=19 + y=513 + width=108 + height=90 + } + "composite name"="" + children { + text { object { - x=409 - y=86 - width=75 + x=19 + y=513 + width=81 height=15 } - monitor { - chan="$(P)$(OUT)UINT16.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt64 LE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=111 - width=75 + x=19 + y=538 + width=108 height=15 } - monitor { - chan="$(P)$(OUT)BCD_UNSIGNED.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt64 LE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=136 - width=75 + x=19 + y=588 + width=108 height=15 } - monitor { - chan="$(P)$(OUT)BCD_SIGNED.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt64 BE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=161 - width=75 + x=19 + y=563 + width=81 height=15 } - monitor { - chan="$(P)$(OUT)INT16.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="UInt64 BE" align="horiz. right" - limits { - } } - "text update" { + } +} +composite { + object { + x=10 + y=613 + width=117 + height=190 + } + "composite name"="" + children { + text { object { - x=409 - y=186 - width=75 + x=10 + y=613 + width=90 height=15 } - monitor { - chan="$(P)$(OUT)INT32_LE.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float32 LE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=211 - width=75 + x=10 + y=638 + width=117 height=15 } - monitor { - chan="$(P)$(OUT)INT32_BE.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float32 LE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=236 - width=75 + x=10 + y=663 + width=90 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT32_LE.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float32 BE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=261 - width=75 + x=10 + y=688 + width=117 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT32_BE.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float32 BE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=286 - width=75 + x=10 + y=713 + width=90 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT64_LE.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float64 LE" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=311 - width=75 + x=10 + y=738 + width=117 height=15 } - monitor { - chan="$(P)$(OUT)FLOAT64_BE.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float64 LE BS" align="horiz. right" - limits { - } } - "text update" { + text { object { - x=409 - y=336 - width=75 + x=10 + y=763 + width=90 height=15 } - monitor { - chan="$(P)$(OUT)DEFAULT.SEVR" - clr=53 - bclr=2 + "basic attribute" { + clr=14 } - clrmod="alarm" + textix="Float64 BE" align="horiz. right" - limits { - } } text { object { - x=411 - y=59 - width=70 - height=20 + x=10 + y=788 + width=117 + height=15 } "basic attribute" { clr=14 } - textix="Severity" - align="horiz. centered" + textix="Float64 BE BS" + align="horiz. right" } } } +text { + object { + x=10 + y=815 + width=153 + height=15 + } + "basic attribute" { + clr=14 + } + textix="LE: Little-endian" +} +text { + object { + x=10 + y=835 + width=126 + height=15 + } + "basic attribute" { + clr=14 + } + textix="BE: Big-endian" +} +text { + object { + x=10 + y=855 + width=144 + height=15 + } + "basic attribute" { + clr=14 + } + textix="BS: Byte-swapped" +} diff --git a/modbusApp/op/adl/modbusDataTypesTest.adl b/modbusApp/op/adl/modbusDataTypesTest.adl index ec78193..91d0106 100644 --- a/modbusApp/op/adl/modbusDataTypesTest.adl +++ b/modbusApp/op/adl/modbusDataTypesTest.adl @@ -1,7 +1,7 @@ file { name="/home/epics/devel/modbus/modbusApp/op/adl/modbusDataTypesTest.adl" - version=030105 + version=030109 } display { object { @@ -113,16 +113,21 @@ text { args="P=SIM1:,OUT=LO:,IN=LI:,OREC=longout,IREC=longin" } display[1] { + label="int64out/int64in" + name="modbusDataTypes.adl" + args="P=SIM1:,OUT=I64O:,IN=I64I:,OREC=int64out,IREC=int64in" + } + display[2] { label="ao/ai" name="modbusDataTypes.adl" args="P=SIM1:,OUT=AO:,IN=AI:,OREC=ao,IREC=ai" } - display[2] { + display[3] { label="Binary inputs" name="Koyo_8inputs.adl" args="P=SIM1:,R=BI,A=B,L=MBBID0,PORT=BI,AC=Bit" } - display[3] { + display[4] { label="Binary outputs" name="Koyo_8outputs.adl" args="P=SIM1:,R=BO,A=B,L=MBBOD0,PORT=BO,AC=Bit" diff --git a/modbusApp/op/bob/autoconvert/Koyo1.bob b/modbusApp/op/bob/autoconvert/Koyo1.bob new file mode 100644 index 0000000..776e34f --- /dev/null +++ b/modbusApp/op/bob/autoconvert/Koyo1.bob @@ -0,0 +1,244 @@ + + + Koyo1 + 100 + 100 + 170 + 145 + + + + + false + 5 + + text #6 + Koyo 1 + 12 + 12 + 146 + 30 + + + + + 1 + + + composite #9 + 5 + 51 + 160 + 85 + + true + + related display #12 + + + Koyo_8inputs.opi + + B + Bit + X0L +

KOYO1:

+ XnB + X +
+ tab + X0-X7 inputs (bit access) +
+ + Koyo_8inputs.opi + + W + Word + XnL +

KOYO1:

+ XnW + X +
+ tab + X0-X7 inputs (word access) +
+ + Koyo_8inputs.opi + + InB + Bit + Y0InBL +

KOYO1:

+ YnInB + Y +
+ tab + Y0-Y7 inputs (bit access) +
+ + Koyo_8inputs.opi + + InW + Word + YnInWL +

KOYO1:

+ YnInW + Y +
+ tab + Y0-Y7 inputs (word access) +
+ + Koyo_8inputs.opi + + InB + Bit + C0InBL +

KOYO1:

+ CnInB + C +
+ tab + C0-C7 inputs (bit access) +
+ + Koyo_8inputs.opi + + InW + Word + CnInWL +

KOYO1:

+ CnInW + C +
+ tab + C0-C7 inputs (word access) +
+ + Koyo_8inputs.opi + + InB + Bit + C200InBL +

KOYO1:

+ CnInB + C20 +
+ tab + C200-C207 inputs (bit access) +
+ + Koyo_8inputs.opi + + InW + Word + C20nInWL +

KOYO1:

+ CnInW + C20 +
+ tab + C200-C207 inputs (word access) +
+
+ Inputs + 158 + 25 + + + + +
+ + related display #22 + + + Koyo_8outputs.opi + + OutB + Bit + Y0OutBL +

KOYO1:

+ YnOutB + Y +
+ tab + Y0-Y7 outputs (bit access) +
+ + Koyo_8outputs.opi + + OutW + Word + YnOutWL +

KOYO1:

+ YnOutW + Y +
+ tab + Y0-Y7 outputs (word access) +
+ + Koyo_8outputs.opi + + OutB + Bit + C200OutBL +

KOYO1:

+ C20nOutB + C20 +
+ tab + C200-C207 outputs (bit access) +
+ + Koyo_8outputs.opi + + OutW + Word + C20nOutWL +

KOYO1:

+ CnOutW + C20 +
+ tab + C200-C207 outputs (word access) +
+
+ Outputs + 30 + 158 + 25 + + + + +
+ + related display #28 + + + asynRecord.opi + +

KOYO1:

+ OctetAsyn +
+ tab + Octet asyn record +
+ + l + tab + +
+ Octet asyn record + 2 + 60 + 158 + 25 + + + + +
+
+
diff --git a/modbusApp/op/bob/autoconvert/Koyo2.bob b/modbusApp/op/bob/autoconvert/Koyo2.bob new file mode 100644 index 0000000..4ff08f6 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/Koyo2.bob @@ -0,0 +1,165 @@ + + + Koyo2 + 100 + 100 + 170 + 145 + + + + + false + 5 + + text #6 + Koyo 2 + 12 + 12 + 146 + 30 + + + + + 1 + + + composite #9 + 5 + 51 + 160 + 85 + + true + + related display #12 + + + Koyo_8inputs.opi + + InB + Bit + Y0InBL +

KOYO2:

+ YnInB + Y +
+ tab + Y0-Y7 inputs (bit access) +
+ + Koyo_8inputs.opi + + InB + Bit + C0InBL +

KOYO2:

+ CnInB + C +
+ tab + C0-C7 inputs (bit access) +
+ + Koyo_8inputs.opi + + InB + Bit + C200InBL +

KOYO2:

+ CnInB + C20 +
+ tab + C200-C207 inputs (bit access) +
+ + Koyo_4ADC.opi + +

KOYO2:

+ V3000InW + ADC1 + ADC2 + ADC3 + ADC4 +
+ tab + ADCs +
+
+ Inputs + 160 + 25 + + + + +
+ + related display #18 + + + Koyo_8outputs.opi + + OutB + Bit + Y0OutBL +

KOYO2:

+ YnOutB + Y +
+ tab + Y0-Y7 outputs (bit access) +
+ + Koyo_8outputs.opi + + OutB + Bit + C200OutBL +

KOYO2:

+ C20nOutB + C20 +
+ tab + C200-C207 outputs (bit access) +
+
+ Outputs + 30 + 160 + 25 + + + + +
+ + related display #22 + + + asynRecord.opi + +

KOYO2:

+ OctetAsyn +
+ tab + Octet asyn record +
+ + l + tab + +
+ Octet asyn record + 60 + 160 + 25 + + + + +
+
+
diff --git a/modbusApp/op/bob/autoconvert/Koyo_4ADC.bob b/modbusApp/op/bob/autoconvert/Koyo_4ADC.bob new file mode 100644 index 0000000..f581352 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/Koyo_4ADC.bob @@ -0,0 +1,499 @@ + + + Koyo_4ADC + 302 + 70 + 330 + 260 + + + + + false + 5 + + text #6 + $(P)$(R1)-$(R4) Inputs + 55 + 12 + 220 + + + + + 1 + + + text #9 + $(R1) + 10 + 87 + 45 + 15 + + + + + 2 + + + text #12 + $(R2) + 10 + 112 + 45 + 15 + + + + + 2 + + + text #15 + $(R3) + 10 + 137 + 45 + 15 + + + + + 2 + + + text #18 + $(R4) + 10 + 162 + 45 + 15 + + + + + 2 + + + text #21 + (ai records) + 111 + 40 + 108 + 15 + + + + + 1 + + + text #24 + RVAL + 85 + 64 + 27 + 15 + + + + + 1 + + + composite #27 + 145 + 64 + 182 + 115 + + true + + text update #30 + $(P)$(R1) + 23 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text update #34 + $(P)$(R2) + 48 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text update #38 + $(P)$(R3) + 73 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text update #42 + $(P)$(R4) + 98 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + composite #46 + 82 + 20 + 100 + 95 + + true + + menu #49 + $(P)$(R1).SCAN + 20 + + + + + false + + + menu #52 + $(P)$(R2).SCAN + 25 + 20 + + + + + false + + + menu #55 + $(P)$(R3).SCAN + 50 + 20 + + + + + false + + + menu #58 + $(P)$(R4).SCAN + 75 + 20 + + + + + false + + + + text #61 + VAL + 24 + 27 + 15 + + + + + 1 + + + + text update #64 + $(P)$(R1).RVAL + 61 + 87 + 75 + 15 + + + + + + + + + + + + + 4 + false + 2 + false + + + text update #68 + $(P)$(R2).RVAL + 61 + 112 + 75 + 15 + + + + + + + + + + + + + 4 + false + 2 + false + + + text update #72 + $(P)$(R3).RVAL + 61 + 137 + 75 + 15 + + + + + + + + + + + + + 4 + false + 2 + false + + + text update #76 + $(P)$(R4).RVAL + 61 + 162 + 75 + 15 + + + + + + + + + + + + + 4 + false + 2 + false + + + composite #80 + 94 + 185 + 145 + 20 + + true + + text entry #83 + $(P)$(PORT)PollDelay + 50 + + + + + + + + + 1 + false + false + + + text #87 + Poll delay + 55 + 3 + 90 + 15 + + + + + 1 + + + + composite #90 + 91 + 210 + 94 + 20 + + true + + related display #93 + + + asynRecord.opi + + $(PORT)Asyn + + tab + asynRecord + + + modbusStatistics.opi + + $(PORT) + + tab + I/O Statistics + + + modbusArray.opi + + $(PORT)Array + + tab + Array + + + + 53 + 20 + + + + + + + text #98 + More + 58 + 3 + 36 + 15 + + + + + 1 + + + + composite #101 + 69 + 235 + 134 + 15 + + true + + text update #104 + $(P)$(R1).SEVR + 75 + 15 + + + + + + + + + 4 + false + 1 + + + text #108 + Status + 80 + 54 + 15 + + + + + 1 + + + diff --git a/modbusApp/op/bob/autoconvert/Koyo_8inputs.bob b/modbusApp/op/bob/autoconvert/Koyo_8inputs.bob new file mode 100644 index 0000000..f70a8ed --- /dev/null +++ b/modbusApp/op/bob/autoconvert/Koyo_8inputs.bob @@ -0,0 +1,1276 @@ + + + Koyo_8inputs + 453 + 33 + 400 + 415 + + + + + false + 5 + + text #6 + $(R)0-$(R)7 Inputs + 110 + 5 + 180 + + + + + 1 + + + text update #9 + $(P)$(R)0$(A) + 70 + 87 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #13 + $(P)$(R)1$(A) + 70 + 112 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #17 + $(P)$(R)2$(A) + 70 + 137 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #21 + $(P)$(R)3$(A) + 70 + 162 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #25 + $(P)$(R)4$(A) + 70 + 187 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #29 + $(P)$(R)5$(A) + 70 + 212 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #33 + $(P)$(R)6$(A) + 70 + 237 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text update #37 + $(P)$(R)7$(A) + 70 + 262 + 50 + 15 + + + + + + + + + 1 + false + 1 + + + text #41 + (mbbiDirect record) + 40 + 287 + 171 + 15 + + + + + 1 + + + text update #44 + $(P)$(L) + 70 + 312 + 50 + 15 + + + + + + + + + 4 + false + 1 + false + + + composite #48 + 5 + 87 + 50 + 190 + + true + + text #51 + $(R)0 + 50 + 15 + + + + + 2 + + + text #54 + $(R)1 + 25 + 50 + 15 + + + + + 2 + + + text #57 + $(R)2 + 50 + 50 + 15 + + + + + 2 + + + text #60 + $(R)3 + 75 + 50 + 15 + + + + + 2 + + + text #63 + $(R)4 + 100 + 50 + 15 + + + + + 2 + + + text #66 + $(R)5 + 125 + 50 + 15 + + + + + 2 + + + text #69 + $(R)6 + 150 + 50 + 15 + + + + + 2 + + + text #72 + $(R)7 + 175 + 50 + 15 + + + + + 2 + + + + composite #75 + 119 + 35 + 108 + 35 + + true + + text #78 + $(AC) access + 9 + 90 + 15 + + + + + 1 + + + text #81 + (bi records) + 20 + 108 + 15 + + + + + 1 + + + + composite #84 + 8 + 335 + 235 + 15 + + true + + text update #87 + $(P)$(L).B0 + 225 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #91 + $(P)$(L).B1 + 210 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #95 + $(P)$(L).B2 + 195 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #99 + $(P)$(L).B3 + 180 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #103 + $(P)$(L).B4 + 165 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #107 + $(P)$(L).B5 + 150 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #111 + $(P)$(L).B6 + 135 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #115 + $(P)$(L).B7 + 120 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #119 + $(P)$(L).B8 + 105 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #123 + $(P)$(L).B9 + 90 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #127 + $(P)$(L).BA + 75 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #131 + $(P)$(L).BB + 60 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #135 + $(P)$(L).BC + 45 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #139 + $(P)$(L).BD + 30 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #143 + $(P)$(L).BE + 15 + 10 + 15 + + + + + + + + + 1 + false + false + + + text update #147 + $(P)$(L).BF + 10 + 15 + + + + + + + + + 1 + false + false + + + + composite #151 + 127 + 84 + 100 + 245 + + true + + menu #154 + $(P)$(R)0$(A).SCAN + 20 + + + + + false + + + menu #157 + $(P)$(R)1$(A).SCAN + 25 + 20 + + + + + false + + + menu #160 + $(P)$(R)2$(A).SCAN + 50 + 20 + + + + + false + + + menu #163 + $(P)$(R)3$(A).SCAN + 75 + 20 + + + + + false + + + menu #166 + $(P)$(R)4$(A).SCAN + 100 + 20 + + + + + false + + + menu #169 + $(P)$(R)5$(A).SCAN + 125 + 20 + + + + + false + + + menu #172 + $(P)$(R)6$(A).SCAN + 150 + 20 + + + + + false + + + menu #175 + $(P)$(R)7$(A).SCAN + 175 + 20 + + + + + false + + + menu #178 + $(P)$(L).SCAN + 225 + 20 + + + + + false + + + + composite #181 + 232 + 60 + 160 + 267 + + true + + text update #184 + $(P)$(L).STAT + 252 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #188 + $(P)$(R)0$(A).STAT + 27 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #192 + $(P)$(R)1$(A).STAT + 52 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #196 + $(P)$(R)2$(A).STAT + 77 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #200 + $(P)$(R)3$(A).STAT + 102 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #204 + $(P)$(R)4$(A).STAT + 127 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #208 + $(P)$(R)5$(A).STAT + 152 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #212 + $(P)$(R)6$(A).STAT + 177 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #216 + $(P)$(R)7$(A).STAT + 202 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #220 + Status + 2 + 70 + + + + + 1 + + + text update #223 + $(P)$(R)0$(A).SEVR + 83 + 27 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #227 + $(P)$(R)1$(A).SEVR + 83 + 52 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #231 + $(P)$(R)2$(A).SEVR + 83 + 77 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #235 + $(P)$(R)3$(A).SEVR + 83 + 102 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #239 + $(P)$(R)4$(A).SEVR + 83 + 127 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #243 + $(P)$(R)5$(A).SEVR + 83 + 152 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #247 + $(P)$(R)6$(A).SEVR + 83 + 177 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #251 + $(P)$(R)7$(A).SEVR + 83 + 202 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #255 + $(P)$(L).SEVR + 83 + 252 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #259 + Severity + 80 + 80 + + + + + 1 + + + + composite #262 + 126 + 365 + 148 + 45 + + true + + text entry #265 + $(P)$(PORT)PollDelay + 1 + 50 + + + + + + + + + 1 + false + false + + + text #269 + Poll delay + 58 + 2 + 90 + 15 + + + + + 1 + + + related display #272 + + + asynRecord.opi + + $(PORT)Asyn + + tab + asynRecord + + + modbusStatistics.opi + + $(PORT) + + tab + I/O Statistics + + + modbusArray.opi + + $(PORT)Array + + tab + Array + + + + 25 + 53 + 20 + + + + + + + text #277 + More + 58 + 27 + 36 + 15 + + + + + 1 + + + diff --git a/modbusApp/op/bob/autoconvert/Koyo_8outputs.bob b/modbusApp/op/bob/autoconvert/Koyo_8outputs.bob new file mode 100644 index 0000000..28f71bb --- /dev/null +++ b/modbusApp/op/bob/autoconvert/Koyo_8outputs.bob @@ -0,0 +1,1116 @@ + + + Koyo_8outputs + 376 + 141 + 360 + 450 + + + + + false + 5 + + choice button #6 + $(P)$(R)0$(A) + 70 + 85 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #9 + $(P)$(R)1$(A) + 70 + 110 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #12 + $(P)$(R)2$(A) + 70 + 135 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #15 + $(P)$(R)3$(A) + 70 + 160 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #18 + $(P)$(R)4$(A) + 70 + 185 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #21 + $(P)$(R)5$(A) + 70 + 210 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #24 + $(P)$(R)6$(A) + 70 + 235 + 20 + + + + + false + + Item 1 + Item 2 + + + + choice button #27 + $(P)$(R)7$(A) + 70 + 260 + 20 + + + + + false + + Item 1 + Item 2 + + + + text #30 + (mbboDirect record) + 15 + 291 + 171 + 15 + + + + + 1 + + + text #33 + $(R)0-$(R)7 Outputs + 90 + 5 + 180 + + + + + 1 + + + composite #36 + 5 + 87 + 50 + 190 + + true + + text #39 + $(R)0 + 50 + 15 + + + + + 2 + + + text #42 + $(R)1 + 25 + 50 + 15 + + + + + 2 + + + text #45 + $(R)2 + 50 + 50 + 15 + + + + + 2 + + + text #48 + $(R)3 + 75 + 50 + 15 + + + + + 2 + + + text #51 + $(R)4 + 100 + 50 + 15 + + + + + 2 + + + text #54 + $(R)5 + 125 + 50 + 15 + + + + + 2 + + + text #57 + $(R)6 + 150 + 50 + 15 + + + + + 2 + + + text #60 + $(R)7 + 175 + 50 + 15 + + + + + 2 + + + + text #63 + $(AC) access + 64 + 38 + 108 + 15 + + + + + 1 + + + text #66 + (bo records) + 64 + 58 + 108 + 15 + + + + + 1 + + + text entry #69 + $(P)$(L) + 60 + 312 + 80 + + + + + + + + + 4 + false + false + + + composite #73 + 16 + 339 + 169 + 43 + + true + + text entry #76 + $(P)$(L).B0 + 105 + 15 + + + + + + + + + 1 + false + false + + + text #80 + B0-B7 + 124 + 4 + 45 + 15 + + + + + true + + + text entry #83 + $(P)$(L).B1 + 90 + 15 + + + + + + + + + 1 + false + false + + + text entry #87 + $(P)$(L).B2 + 75 + 15 + + + + + + + + + 1 + false + false + + + text entry #91 + $(P)$(L).B3 + 60 + 15 + + + + + + + + + 1 + false + false + + + text entry #95 + $(P)$(L).B4 + 45 + 15 + + + + + + + + + 1 + false + false + + + text entry #99 + $(P)$(L).B5 + 30 + 15 + + + + + + + + + 1 + false + false + + + text entry #103 + $(P)$(L).B6 + 15 + 15 + + + + + + + + + 1 + false + false + + + text entry #107 + $(P)$(L).B7 + 15 + + + + + + + + + 1 + false + false + + + text #111 + B8-BF + 123 + 24 + 45 + 15 + + + + + true + + + text entry #114 + $(P)$(L).B8 + 105 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #118 + $(P)$(L).B9 + 90 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #122 + $(P)$(L).BA + 75 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #126 + $(P)$(L).BB + 60 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #130 + $(P)$(L).BC + 45 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #134 + $(P)$(L).BD + 30 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #138 + $(P)$(L).BE + 15 + 23 + 15 + + + + + + + + + 1 + false + false + + + text entry #142 + $(P)$(L).BF + 23 + 15 + + + + + + + + + 1 + false + false + + + + text update #146 + $(P)$(L).STAT + 189 + 315 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #150 + $(P)$(R)0$(A).STAT + 189 + 87 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #154 + $(P)$(R)1$(A).STAT + 189 + 112 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #158 + $(P)$(R)2$(A).STAT + 189 + 137 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #162 + $(P)$(R)3$(A).STAT + 189 + 162 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #166 + $(P)$(R)4$(A).STAT + 189 + 187 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #170 + $(P)$(R)5$(A).STAT + 189 + 212 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #174 + $(P)$(R)6$(A).STAT + 189 + 237 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #178 + $(P)$(R)7$(A).STAT + 189 + 262 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #182 + Status + 191 + 60 + 70 + + + + + 1 + + + text update #185 + $(P)$(R)0$(A).SEVR + 272 + 87 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #189 + $(P)$(R)1$(A).SEVR + 272 + 112 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #193 + $(P)$(R)2$(A).SEVR + 272 + 137 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #197 + $(P)$(R)3$(A).SEVR + 272 + 162 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #201 + $(P)$(R)4$(A).SEVR + 272 + 187 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #205 + $(P)$(R)5$(A).SEVR + 272 + 212 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #209 + $(P)$(R)6$(A).SEVR + 272 + 237 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #213 + $(P)$(R)7$(A).SEVR + 272 + 262 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #217 + $(P)$(L).SEVR + 272 + 315 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #221 + Severity + 269 + 60 + 80 + + + + + 1 + + + composite #224 + 133 + 413 + 94 + 20 + + true + + related display #227 + + + asynRecord.opi + + $(PORT)Asyn + + tab + asynRecord + + + modbusStatistics.opi + + $(PORT) + + tab + I/O Statistics + + + + 53 + 20 + + + + + + + text #231 + More + 58 + 3 + 36 + 15 + + + + + 1 + + + diff --git a/modbusApp/op/bob/autoconvert/array_test.bob b/modbusApp/op/bob/autoconvert/array_test.bob new file mode 100644 index 0000000..c47412f --- /dev/null +++ b/modbusApp/op/bob/autoconvert/array_test.bob @@ -0,0 +1,89 @@ + + + array_test + 446 + 76 + 250 + 100 + + + + + false + 5 + + text #6 + Array Test + 65 + 7 + 120 + 25 + + + + + 1 + + + related display #9 + + + modbusArrayTest.opi + +

SIM1:

+ UINT16: +
+ tab + UINT16 +
+ + modbusArrayTest.opi + +

SIM1:

+ INT16: +
+ tab + INT16 +
+ + modbusArrayTest.opi + +

SIM1:

+ INT32_LE: +
+ tab + INT32_LE +
+ + modbusArrayTest.opi + +

SIM1:

+ INT32_BE: +
+ tab + INT32_BE +
+
+ Arrays + 98 + 58 + 120 + 20 + + + + +
+ + text #15 + Arrays + 33 + 58 + 60 + + + + + 1 + +
diff --git a/modbusApp/op/bob/autoconvert/modbusArray.bob b/modbusApp/op/bob/autoconvert/modbusArray.bob new file mode 100644 index 0000000..0945eda --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusArray.bob @@ -0,0 +1,179 @@ + + + modbusArray + 730 + 175 + 560 + 315 + + + + + false + 5 + + cartesian plot #6 + 5 + 5 + 550 + 275 + Array data for $(P)$(R) + + Array index + true + false + 0.0 + 100.0 + false + + + + + + + + + true + + + + Value + true + false + 0.0 + 100.0 + false + + + + + + + + + true + + + + + $(traces[0].y_pv) + + $(P)$(R) + + 0 + 1 + + + + + 1 + 0 + 0 + 10 + true + + + + + text #10 + Severity + 375 + 287 + 80 + + + + + 1 + + + text update #13 + $(P)$(R).SEVR + 460 + 290 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #17 + Status + 214 + 287 + 60 + + + + + 1 + + + text update #20 + $(P)$(R).STAT + 279 + 290 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + composite #24 + 20 + 287 + 167 + 20 + + true + + menu #27 + $(P)$(R).SCAN + 67 + 20 + + + + + false + + + text #30 + Update: + 3 + 63 + 15 + + + + + true + + + diff --git a/modbusApp/op/bob/autoconvert/modbusArrayTest.bob b/modbusApp/op/bob/autoconvert/modbusArrayTest.bob new file mode 100644 index 0000000..4a06b2c --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusArrayTest.bob @@ -0,0 +1,270 @@ + + + modbusArrayTest + 499 + 277 + 560 + 350 + + + + + false + 5 + + cartesian plot #6 + 5 + 5 + 550 + 275 + Array data for $(P)$(R) + + Array index + true + false + 0.0 + 100.0 + false + + + + + + + + + true + + + + Value + true + false + 0.0 + 100.0 + false + + + + + + + + + true + + + + + $(traces[0].y_pv) + + $(P)$(R)ArrayIn + + 0 + 1 + + + + + 1 + 0 + 0 + 10 + true + + + + + text #10 + Severity + 375 + 288 + 80 + + + + + 1 + + + text update #13 + $(P)$(R)ArrayIn.SEVR + 460 + 291 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #17 + Status + 214 + 288 + 60 + + + + + 1 + + + text update #20 + $(P)$(R)ArrayIn.STAT + 279 + 291 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #24 + $(P)$(R)ArrayIn.SCAN + 87 + 288 + 20 + + + + + false + + + text #27 + Update + 20 + 288 + 60 + + + + + true + + + text entry #30 + $(P)$(R)PollDelay + 117 + 319 + 50 + + + + + + + + + 1 + false + false + + + text #34 + Poll delay + 12 + 319 + + + + + 1 + + + related display #37 + + + asynRecord.opi + + A0:AsynOut + + tab + asynRecord Out + + + asynRecord.opi + + A0:AsynIn + + tab + asynRecord In + + + modbusStatistics.opi + + A0: + + tab + I/O Statistics + + + More + 396 + 319 + 53 + 20 + + + + + + + text #42 + Poll trigger + 194 + 319 + 120 + + + + + 1 + + + message button #45 + + + $(P)$(R)PollTrigger + 1 + Write + + + $(P)$(R)PollTrigger + Trigger + 319 + 319 + 57 + 20 + + + + + + diff --git a/modbusApp/op/bob/autoconvert/modbusDataTypes.bob b/modbusApp/op/bob/autoconvert/modbusDataTypes.bob new file mode 100644 index 0000000..57ad777 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusDataTypes.bob @@ -0,0 +1,4859 @@ + + + modbusDataTypes + 331 + 120 + 725 + 880 + + + + + false + 5 + + text #6 + Modbus Data Type Test + 236 + 12 + 252 + 25 + + + + + 1 + + + text entry #9 + $(P)$(OUT)PollDelay + 291 + 818 + 50 + + + + + + + + + 1 + false + false + + + text #13 + Poll delay + 346 + 821 + 90 + 15 + + + + + 1 + + + related display #16 + + + asynRecord.opi + + $(OUT)AsynOut + + tab + asynRecord Out + + + asynRecord.opi + + $(OUT)AsynIn + + tab + asynRecord In + + + modbusStatistics.opi + + $(OUT) + + tab + I/O Statistics + + + + 288 + 843 + 53 + 20 + + + + + + + text #21 + More + 346 + 846 + 36 + 15 + + + + + 1 + + + menu #24 + $(P)$(IN)UINT16.SCAN + 617 + 85 + 20 + + + + + false + + + text update #27 + $(P)$(IN)UINT16 + 377 + 88 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #31 + $(P)$(OUT)UINT16 + 132 + 85 + 80 + + + + + + + + + 1 + false + false + + + text #35 + UInt16 + 73 + 88 + 54 + 15 + + + + + 2 + + + text update #38 + $(P)$(IN)UINT16.STAT + 457 + 88 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #42 + $(P)$(IN)UINT16.SEVR + 537 + 88 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #46 + $(P)$(OUT)UINT16.STAT + 217 + 88 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #50 + $(P)$(OUT)UINT16.SEVR + 297 + 88 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #54 + $(P)$(IN)BCD_UNSIGNED.SCAN + 617 + 110 + 20 + + + + + false + + + text update #57 + $(P)$(IN)BCD_UNSIGNED + 377 + 113 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #61 + $(P)$(OUT)BCD_UNSIGNED + 132 + 110 + 80 + + + + + + + + + 1 + false + false + + + text #65 + UInt16 BCD + 37 + 113 + 90 + 15 + + + + + 2 + + + text update #68 + $(P)$(IN)BCD_UNSIGNED.STAT + 457 + 113 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #72 + $(P)$(IN)BCD_UNSIGNED.SEVR + 537 + 113 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #76 + $(P)$(OUT)BCD_UNSIGNED.STAT + 217 + 113 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #80 + $(P)$(OUT)BCD_UNSIGNED.SEVR + 297 + 113 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #84 + $(P)$(IN)BCD_SIGNED.SCAN + 617 + 135 + 20 + + + + + false + + + text update #87 + $(P)$(IN)BCD_SIGNED + 377 + 138 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #91 + $(P)$(OUT)BCD_SIGNED + 132 + 135 + 80 + + + + + + + + + 1 + false + false + + + text #95 + Int16 BCD + 46 + 138 + 81 + 15 + + + + + 2 + + + text update #98 + $(P)$(IN)BCD_SIGNED.STAT + 457 + 138 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #102 + $(P)$(IN)BCD_SIGNED.SEVR + 537 + 138 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #106 + $(P)$(OUT)BCD_SIGNED.STAT + 217 + 138 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #110 + $(P)$(OUT)BCD_SIGNED.SEVR + 297 + 138 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #114 + $(P)$(IN)INT16.SCAN + 617 + 185 + 20 + + + + + false + + + text update #117 + $(P)$(IN)INT16 + 377 + 188 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #121 + $(P)$(OUT)INT16 + 132 + 185 + 80 + + + + + + + + + 1 + false + false + + + text #125 + Int16 + 82 + 188 + 45 + 15 + + + + + 2 + + + text update #128 + $(P)$(IN)INT16.STAT + 457 + 188 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #132 + $(P)$(IN)INT16.SEVR + 537 + 188 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #136 + $(P)$(OUT)INT16.STAT + 217 + 188 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #140 + $(P)$(OUT)INT16.SEVR + 297 + 188 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #144 + $(P)$(IN)INT32_LE.SCAN + 617 + 210 + 20 + + + + + false + + + text update #147 + $(P)$(IN)INT32_LE + 377 + 213 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #151 + $(P)$(OUT)INT32_LE + 132 + 210 + 80 + + + + + + + + + 1 + false + false + + + text update #155 + $(P)$(IN)INT32_LE.STAT + 457 + 213 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #159 + $(P)$(IN)INT32_LE.SEVR + 537 + 213 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #163 + $(P)$(OUT)INT32_LE.STAT + 217 + 213 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #167 + $(P)$(OUT)INT32_LE.SEVR + 297 + 213 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #171 + $(P)$(IN)INT32_LE_BS.SCAN + 617 + 235 + 20 + + + + + false + + + text update #174 + $(P)$(IN)INT32_LE_BS + 377 + 238 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #178 + $(P)$(OUT)INT32_LE_BS + 132 + 235 + 80 + + + + + + + + + 1 + false + false + + + text update #182 + $(P)$(IN)INT32_LE_BS.STAT + 457 + 238 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #186 + $(P)$(IN)INT32_LE_BS.SEVR + 537 + 238 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #190 + $(P)$(OUT)INT32_LE_BS.STAT + 217 + 238 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #194 + $(P)$(OUT)INT32_LE_BS.SEVR + 297 + 238 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #198 + $(P)$(IN)INT32_BE_BS.SCAN + 617 + 285 + 20 + + + + + false + + + text update #201 + $(P)$(IN)INT32_BE_BS + 377 + 288 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #205 + $(P)$(OUT)INT32_BE_BS + 132 + 285 + 80 + + + + + + + + + 1 + false + false + + + text update #209 + $(P)$(IN)INT32_BE_BS.STAT + 457 + 288 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #213 + $(P)$(IN)INT32_BE_BS.SEVR + 537 + 288 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #217 + $(P)$(OUT)INT32_BE_BS.STAT + 217 + 288 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #221 + $(P)$(OUT)INT32_BE_BS.SEVR + 297 + 288 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #225 + $(P)$(IN)INT32_BE.SCAN + 617 + 260 + 20 + + + + + false + + + text update #228 + $(P)$(IN)INT32_BE + 377 + 263 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #232 + $(P)$(OUT)INT32_BE + 132 + 260 + 80 + + + + + + + + + 1 + false + false + + + text update #236 + $(P)$(IN)INT32_BE.STAT + 457 + 263 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #240 + $(P)$(IN)INT32_BE.SEVR + 537 + 263 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #244 + $(P)$(OUT)INT32_BE.STAT + 217 + 263 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #248 + $(P)$(OUT)INT32_BE.SEVR + 297 + 263 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #252 + $(P)$(IN)UINT32_LE.SCAN + 617 + 310 + 20 + + + + + false + + + text update #255 + $(P)$(IN)UINT32_LE + 377 + 313 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #259 + $(P)$(OUT)UINT32_LE + 132 + 310 + 80 + + + + + + + + + 1 + false + false + + + text update #263 + $(P)$(IN)UINT32_LE.STAT + 457 + 313 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #267 + $(P)$(IN)UINT32_LE.SEVR + 537 + 313 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #271 + $(P)$(OUT)UINT32_LE.STAT + 217 + 313 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #275 + $(P)$(OUT)UINT32_LE.SEVR + 297 + 313 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #279 + $(P)$(IN)UINT32_LE_BS.SCAN + 617 + 335 + 20 + + + + + false + + + text update #282 + $(P)$(IN)UINT32_LE_BS + 377 + 338 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #286 + $(P)$(OUT)UINT32_LE_BS + 132 + 335 + 80 + + + + + + + + + 1 + false + false + + + text update #290 + $(P)$(IN)UINT32_LE_BS.STAT + 457 + 338 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #294 + $(P)$(IN)UINT32_LE_BS.SEVR + 537 + 338 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #298 + $(P)$(OUT)UINT32_LE_BS.STAT + 217 + 338 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #302 + $(P)$(OUT)UINT32_LE_BS.SEVR + 297 + 338 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #306 + $(P)$(IN)UINT32_BE_BS.SCAN + 617 + 385 + 20 + + + + + false + + + text update #309 + $(P)$(IN)UINT32_BE_BS + 377 + 388 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #313 + $(P)$(OUT)UINT32_BE_BS + 132 + 385 + 80 + + + + + + + + + 1 + false + false + + + text update #317 + $(P)$(IN)UINT32_BE_BS.STAT + 457 + 388 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #321 + $(P)$(IN)UINT32_BE_BS.SEVR + 537 + 388 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #325 + $(P)$(OUT)UINT32_BE_BS.STAT + 217 + 388 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #329 + $(P)$(OUT)UINT32_BE_BS.SEVR + 297 + 388 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #333 + $(P)$(IN)UINT32_BE.SCAN + 617 + 360 + 20 + + + + + false + + + text update #336 + $(P)$(IN)UINT32_BE + 377 + 363 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #340 + $(P)$(OUT)UINT32_BE + 132 + 360 + 80 + + + + + + + + + 1 + false + false + + + text update #344 + $(P)$(IN)UINT32_BE.STAT + 457 + 363 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #348 + $(P)$(IN)UINT32_BE.SEVR + 537 + 363 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #352 + $(P)$(OUT)UINT32_BE.STAT + 217 + 363 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #356 + $(P)$(OUT)UINT32_BE.SEVR + 297 + 363 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #360 + $(P)$(IN)INT64_LE.SCAN + 617 + 410 + 20 + + + + + false + + + text update #363 + $(P)$(IN)INT64_LE + 377 + 413 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #367 + $(P)$(OUT)INT64_LE + 132 + 410 + 80 + + + + + + + + + 1 + false + false + + + text update #371 + $(P)$(IN)INT64_LE.STAT + 457 + 413 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #375 + $(P)$(IN)INT64_LE.SEVR + 537 + 413 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #379 + $(P)$(OUT)INT64_LE.STAT + 217 + 413 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #383 + $(P)$(OUT)INT64_LE.SEVR + 297 + 413 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #387 + $(P)$(IN)INT64_LE_BS.SCAN + 617 + 435 + 20 + + + + + false + + + text update #390 + $(P)$(IN)INT64_LE_BS + 377 + 438 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #394 + $(P)$(OUT)INT64_LE_BS + 132 + 435 + 80 + + + + + + + + + 1 + false + false + + + text update #398 + $(P)$(IN)INT64_LE_BS.STAT + 457 + 438 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #402 + $(P)$(IN)INT64_LE_BS.SEVR + 537 + 438 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #406 + $(P)$(OUT)INT64_LE_BS.STAT + 217 + 438 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #410 + $(P)$(OUT)INT64_LE_BS.SEVR + 297 + 438 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #414 + $(P)$(IN)INT64_BE_BS.SCAN + 617 + 485 + 20 + + + + + false + + + text update #417 + $(P)$(IN)INT64_BE_BS + 377 + 488 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #421 + $(P)$(OUT)INT64_BE_BS + 132 + 485 + 80 + + + + + + + + + 1 + false + false + + + text update #425 + $(P)$(IN)INT64_BE_BS.STAT + 457 + 488 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #429 + $(P)$(IN)INT64_BE_BS.SEVR + 537 + 488 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #433 + $(P)$(OUT)INT64_BE_BS.STAT + 217 + 488 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #437 + $(P)$(OUT)INT64_BE_BS.SEVR + 297 + 488 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #441 + $(P)$(IN)INT64_BE.SCAN + 617 + 460 + 20 + + + + + false + + + text update #444 + $(P)$(IN)INT64_BE + 377 + 463 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #448 + $(P)$(OUT)INT64_BE + 132 + 460 + 80 + + + + + + + + + 1 + false + false + + + text update #452 + $(P)$(IN)INT64_BE.STAT + 457 + 463 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #456 + $(P)$(IN)INT64_BE.SEVR + 537 + 463 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #460 + $(P)$(OUT)INT64_BE.STAT + 217 + 463 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #464 + $(P)$(OUT)INT64_BE.SEVR + 297 + 463 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #468 + $(P)$(IN)UINT64_LE.SCAN + 617 + 510 + 20 + + + + + false + + + text update #471 + $(P)$(IN)UINT64_LE + 377 + 513 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #475 + $(P)$(OUT)UINT64_LE + 132 + 510 + 80 + + + + + + + + + 1 + false + false + + + text update #479 + $(P)$(IN)UINT64_LE.STAT + 457 + 513 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #483 + $(P)$(IN)UINT64_LE.SEVR + 537 + 513 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #487 + $(P)$(OUT)UINT64_LE.STAT + 217 + 513 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #491 + $(P)$(OUT)UINT64_LE.SEVR + 297 + 513 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #495 + $(P)$(IN)UINT64_LE_BS.SCAN + 617 + 535 + 20 + + + + + false + + + text update #498 + $(P)$(IN)UINT64_LE_BS + 377 + 538 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #502 + $(P)$(OUT)UINT64_LE_BS + 132 + 535 + 80 + + + + + + + + + 1 + false + false + + + text update #506 + $(P)$(IN)UINT64_LE_BS.STAT + 457 + 538 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #510 + $(P)$(IN)UINT64_LE_BS.SEVR + 537 + 538 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #514 + $(P)$(OUT)UINT64_LE_BS.STAT + 217 + 538 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #518 + $(P)$(OUT)UINT64_LE_BS.SEVR + 297 + 538 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #522 + $(P)$(IN)UINT64_BE_BS.SCAN + 617 + 585 + 20 + + + + + false + + + text update #525 + $(P)$(IN)UINT64_BE_BS + 377 + 588 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #529 + $(P)$(OUT)UINT64_BE_BS + 132 + 585 + 80 + + + + + + + + + 1 + false + false + + + text update #533 + $(P)$(IN)UINT64_BE_BS.STAT + 457 + 588 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #537 + $(P)$(IN)UINT64_BE_BS.SEVR + 537 + 588 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #541 + $(P)$(OUT)UINT64_BE_BS.STAT + 217 + 588 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #545 + $(P)$(OUT)UINT64_BE_BS.SEVR + 297 + 588 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #549 + $(P)$(IN)UINT64_BE.SCAN + 617 + 560 + 20 + + + + + false + + + text update #552 + $(P)$(IN)UINT64_BE + 377 + 563 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #556 + $(P)$(OUT)UINT64_BE + 132 + 560 + 80 + + + + + + + + + 1 + false + false + + + text update #560 + $(P)$(IN)UINT64_BE.STAT + 457 + 563 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #564 + $(P)$(IN)UINT64_BE.SEVR + 537 + 563 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #568 + $(P)$(OUT)UINT64_BE.STAT + 217 + 563 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #572 + $(P)$(OUT)UINT64_BE.SEVR + 297 + 563 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #576 + $(P)$(IN)FLOAT32_LE.SCAN + 617 + 610 + 20 + + + + + false + + + text update #579 + $(P)$(IN)FLOAT32_LE + 377 + 613 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #583 + $(P)$(OUT)FLOAT32_LE + 132 + 610 + 80 + + + + + + + + + 1 + false + false + + + text update #587 + $(P)$(IN)FLOAT32_LE.STAT + 457 + 613 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #591 + $(P)$(IN)FLOAT32_LE.SEVR + 537 + 613 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #595 + $(P)$(OUT)FLOAT32_LE.STAT + 217 + 613 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #599 + $(P)$(OUT)FLOAT32_LE.SEVR + 297 + 613 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #603 + $(P)$(IN)FLOAT32_LE_BS.SCAN + 617 + 635 + 20 + + + + + false + + + text update #606 + $(P)$(IN)FLOAT32_LE_BS + 377 + 638 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #610 + $(P)$(OUT)FLOAT32_LE_BS + 132 + 635 + 80 + + + + + + + + + 1 + false + false + + + text update #614 + $(P)$(IN)FLOAT32_LE_BS.STAT + 457 + 638 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #618 + $(P)$(IN)FLOAT32_LE_BS.SEVR + 537 + 638 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #622 + $(P)$(OUT)FLOAT32_LE_BS.STAT + 217 + 638 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #626 + $(P)$(OUT)FLOAT32_LE_BS.SEVR + 297 + 638 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #630 + $(P)$(IN)FLOAT32_BE.SCAN + 617 + 660 + 20 + + + + + false + + + text update #633 + $(P)$(IN)FLOAT32_BE + 377 + 663 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #637 + $(P)$(OUT)FLOAT32_BE + 132 + 660 + 80 + + + + + + + + + 1 + false + false + + + text update #641 + $(P)$(IN)FLOAT32_BE.STAT + 457 + 663 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #645 + $(P)$(IN)FLOAT32_BE.SEVR + 537 + 663 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #649 + $(P)$(OUT)FLOAT32_BE.STAT + 217 + 663 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #653 + $(P)$(OUT)FLOAT32_BE.SEVR + 297 + 663 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #657 + $(P)$(IN)FLOAT32_BE_BS.SCAN + 617 + 685 + 20 + + + + + false + + + text update #660 + $(P)$(IN)FLOAT32_BE_BS + 377 + 688 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #664 + $(P)$(OUT)FLOAT32_BE_BS + 132 + 685 + 80 + + + + + + + + + 1 + false + false + + + text update #668 + $(P)$(IN)FLOAT32_BE_BS.STAT + 457 + 688 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #672 + $(P)$(IN)FLOAT32_BE_BS.SEVR + 537 + 688 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #676 + $(P)$(OUT)FLOAT32_BE_BS.STAT + 217 + 688 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #680 + $(P)$(OUT)FLOAT32_BE_BS.SEVR + 297 + 688 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #684 + $(P)$(IN)FLOAT64_LE.SCAN + 617 + 710 + 20 + + + + + false + + + text update #687 + $(P)$(IN)FLOAT64_LE + 377 + 713 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #691 + $(P)$(OUT)FLOAT64_LE + 132 + 710 + 80 + + + + + + + + + 1 + false + false + + + text update #695 + $(P)$(IN)FLOAT64_LE.STAT + 457 + 713 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #699 + $(P)$(IN)FLOAT64_LE.SEVR + 537 + 713 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #703 + $(P)$(OUT)FLOAT64_LE.STAT + 217 + 713 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #707 + $(P)$(OUT)FLOAT64_LE.SEVR + 297 + 713 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #711 + $(P)$(IN)FLOAT64_LE_BS.SCAN + 617 + 735 + 20 + + + + + false + + + text update #714 + $(P)$(IN)FLOAT64_LE_BS + 377 + 738 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #718 + $(P)$(OUT)FLOAT64_LE_BS + 132 + 735 + 80 + + + + + + + + + 1 + false + false + + + text update #722 + $(P)$(IN)FLOAT64_LE_BS.STAT + 457 + 738 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #726 + $(P)$(IN)FLOAT64_LE_BS.SEVR + 537 + 738 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #730 + $(P)$(OUT)FLOAT64_LE_BS.STAT + 217 + 738 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #734 + $(P)$(OUT)FLOAT64_LE_BS.SEVR + 297 + 738 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #738 + $(P)$(IN)FLOAT64_BE.SCAN + 617 + 760 + 20 + + + + + false + + + text update #741 + $(P)$(IN)FLOAT64_BE + 377 + 763 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #745 + $(P)$(OUT)FLOAT64_BE + 132 + 760 + 80 + + + + + + + + + 1 + false + false + + + text update #749 + $(P)$(IN)FLOAT64_BE.STAT + 457 + 763 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #753 + $(P)$(IN)FLOAT64_BE.SEVR + 537 + 763 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #757 + $(P)$(OUT)FLOAT64_BE.STAT + 217 + 763 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #761 + $(P)$(OUT)FLOAT64_BE.SEVR + 297 + 763 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #765 + $(P)$(IN)FLOAT64_BE_BS.SCAN + 617 + 785 + 20 + + + + + false + + + text update #768 + $(P)$(IN)FLOAT64_BE_BS + 377 + 788 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #772 + $(P)$(OUT)FLOAT64_BE_BS + 132 + 785 + 80 + + + + + + + + + 1 + false + false + + + text update #776 + $(P)$(IN)FLOAT64_BE_BS.STAT + 457 + 788 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #780 + $(P)$(IN)FLOAT64_BE_BS.SEVR + 537 + 788 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #784 + $(P)$(OUT)FLOAT64_BE_BS.STAT + 217 + 788 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #788 + $(P)$(OUT)FLOAT64_BE_BS.SEVR + 297 + 788 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + menu #792 + $(P)$(IN)INT16SM.SCAN + 617 + 160 + 20 + + + + + false + + + text update #795 + $(P)$(IN)INT16SM + 377 + 163 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + false + + + text entry #799 + $(P)$(OUT)INT16SM + 132 + 160 + 80 + + + + + + + + + 1 + false + false + + + text #803 + Int16 SM + 55 + 163 + 72 + 15 + + + + + 2 + + + text update #806 + $(P)$(IN)INT16SM.STAT + 457 + 163 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #810 + $(P)$(IN)INT16SM.SEVR + 537 + 163 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #814 + $(P)$(OUT)INT16SM.STAT + 217 + 163 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text update #818 + $(P)$(OUT)INT16SM.SEVR + 297 + 163 + 75 + 15 + + + + + + + + + + + + + 1 + false + 2 + + + text #822 + Scan + 662 + 60 + 40 + + + + + 1 + + + text #825 + $(IREC) + 394 + 60 + 70 + + + + + 1 + + + text #828 + $(OREC) + 152 + 60 + 70 + + + + + 1 + + + text #831 + Status + 479 + 60 + 60 + + + + + 1 + + + text #834 + Severity + 549 + 60 + 80 + + + + + 1 + + + text #837 + Status + 239 + 60 + 60 + + + + + 1 + + + text #840 + Severity + 309 + 60 + 80 + + + + + 1 + + + composite #843 + 28 + 213 + 99 + 90 + + true + + text #846 + Int32 LE + 72 + 15 + + + + + 2 + + + text #849 + Int32 LE BS + 25 + 99 + 15 + + + + + 2 + + + text #852 + Int32 BE BS + 75 + 99 + 15 + + + + + 2 + + + text #855 + Int32 BE + 50 + 72 + 15 + + + + + 2 + + + + composite #858 + 19 + 313 + 108 + 90 + + true + + text #861 + UInt32 LE BS + 25 + 108 + 15 + + + + + 2 + + + text #864 + UInt32 BE BS + 75 + 108 + 15 + + + + + 2 + + + text #867 + UInt32 BE + 50 + 81 + 15 + + + + + 2 + + + text #870 + UInt32 LE + 81 + 15 + + + + + 2 + + + + composite #873 + 28 + 413 + 99 + 90 + + true + + text #876 + Int64 LE + 72 + 15 + + + + + 2 + + + text #879 + Int64 LE BS + 25 + 99 + 15 + + + + + 2 + + + text #882 + Int64 BE BS + 75 + 99 + 15 + + + + + 2 + + + text #885 + Int64 BE + 50 + 72 + 15 + + + + + 2 + + + + composite #888 + 19 + 513 + 108 + 90 + + true + + text #891 + UInt64 LE + 81 + 15 + + + + + 2 + + + text #894 + UInt64 LE BS + 25 + 108 + 15 + + + + + 2 + + + text #897 + UInt64 BE BS + 75 + 108 + 15 + + + + + 2 + + + text #900 + UInt64 BE + 50 + 81 + 15 + + + + + 2 + + + + composite #903 + 10 + 613 + 117 + 190 + + true + + text #906 + Float32 LE + 90 + 15 + + + + + 2 + + + text #909 + Float32 LE BS + 25 + 117 + 15 + + + + + 2 + + + text #912 + Float32 BE + 50 + 90 + 15 + + + + + 2 + + + text #915 + Float32 BE BS + 75 + 117 + 15 + + + + + 2 + + + text #918 + Float64 LE + 100 + 90 + 15 + + + + + 2 + + + text #921 + Float64 LE BS + 125 + 117 + 15 + + + + + 2 + + + text #924 + Float64 BE + 150 + 90 + 15 + + + + + 2 + + + text #927 + Float64 BE BS + 175 + 117 + 15 + + + + + 2 + + + + text #930 + LE: Little-endian + 10 + 815 + 153 + 15 + + + + + true + + + text #933 + BE: Big-endian + 10 + 835 + 126 + 15 + + + + + true + + + text #936 + BS: Byte-swapped + 10 + 855 + 144 + 15 + + + + + true + + diff --git a/modbusApp/op/bob/autoconvert/modbusDataTypesTest.bob b/modbusApp/op/bob/autoconvert/modbusDataTypesTest.bob new file mode 100644 index 0000000..71bb911 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusDataTypesTest.bob @@ -0,0 +1,130 @@ + + + modbusDataTypesTest + 100 + 100 + 170 + 120 + + + + + false + 5 + + text #6 + Sim1 Test + 12 + 12 + 146 + 25 + + + + + 1 + + + related display #9 + + + modbusDataTypes.opi + + LI: + longin + longout + LO: +

SIM1:

+
+ tab + longout/longin +
+ + modbusDataTypes.opi + + I64I: + int64in + int64out + I64O: +

SIM1:

+
+ tab + int64out/int64in +
+ + modbusDataTypes.opi + + AI: + ai + ao + AO: +

SIM1:

+
+ tab + ao/ai +
+ + Koyo_8inputs.opi + + B + Bit + MBBID0 +

SIM1:

+ BI + BI +
+ tab + Binary inputs +
+ + Koyo_8outputs.opi + + B + Bit + MBBOD0 +

SIM1:

+ BO + BO +
+ tab + Binary outputs +
+
+ Inputs & outputs + 5 + 51 + 158 + 25 + + + + +
+ + related display #16 + + + asynRecord.opi + +

SIM1:

+ OctetAsyn +
+ tab + Octet asyn record +
+ + l + tab + +
+ Octet asyn record + 7 + 81 + 158 + 25 + + + + +
+
diff --git a/modbusApp/op/bob/autoconvert/modbusStatistics.bob b/modbusApp/op/bob/autoconvert/modbusStatistics.bob new file mode 100644 index 0000000..69f4219 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusStatistics.bob @@ -0,0 +1,358 @@ + + + modbusStatistics + 730 + 50 + 560 + 375 + + + + + false + 5 + + cartesian plot #6 + 5 + 5 + 550 + 275 + Histogram of cycle times $(P)$(R) + + Write/read cycle time (msec) + true + false + 0.0 + 100.0 + false + + + + + + + + + true + + + + Number of events + true + false + 0.0 + 100.0 + false + + + + + + + + + true + + + + + $(traces[0].y_pv) + $(P)$(R)HistTimeAxis + $(P)$(R)Hist + + 0 + 1 + + + + + 1 + 0 + 0 + 10 + true + + + + + choice button #10 + $(P)$(R)HistEnable + 202 + 286 + 150 + 20 + + + + + false + + Item 1 + Item 2 + + + + text #13 + Enable histogramming: + 10 + 289 + 189 + 15 + + + + + true + + + menu #16 + $(P)$(R)Statistics.SCAN + 437 + 286 + 20 + + + + + false + + + text #19 + Update: + 370 + 289 + 63 + 15 + + + + + true + + + text #22 + msec per bin + 11 + 309 + 72 + 15 + + + + + true + + + composite #25 + 10 + 329 + 542 + 36 + + true + + composite #28 + 145 + 15 + + true + + text update #31 + $(P)$(R)ReadOK + 75 + 70 + 15 + + + + + + + + + + + + + 1 + false + false + + + text #35 + Read OK: + 72 + 15 + + + + + true + + + + text update #38 + $(P)$(R)WriteOK + 241 + 70 + 15 + + + + + + + + + + + + + 1 + false + false + + + text #42 + Write OK: + 155 + 81 + 15 + + + + + true + + + text update #45 + $(P)$(R)IOErrors + 435 + 70 + 15 + + + + + + + + + + + + + 1 + false + false + + + text #49 + I/O Errors: + 332 + 99 + 15 + + + + + true + + + composite #52 + 21 + 265 + 15 + + true + + text #55 + Last I/O Time (msec): + 189 + 15 + + + + + true + + + text update #58 + $(P)$(R)LastIOTime + 195 + 70 + 15 + + + + + + + + + + + + + 1 + false + false + + + + text #62 + Max. I/O Time (msec): + 277 + 21 + 189 + 15 + + + + + true + + + text update #65 + $(P)$(R)MaxIOTime + 472 + 21 + 70 + 15 + + + + + + + + + + + + + 1 + false + false + + + + text entry #69 + $(P)$(R)MsPerBin + 129 + 309 + 78 + 15 + + + + + + + + + 1 + false + false + + diff --git a/modbusApp/op/bob/autoconvert/modbusStringTest.bob b/modbusApp/op/bob/autoconvert/modbusStringTest.bob new file mode 100644 index 0000000..5a753b8 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusStringTest.bob @@ -0,0 +1,639 @@ + + + modbusStringTest + 79 + 100 + 1220 + 300 + + + + + false + 5 + + text #6 + Modbus String Test + 502 + 12 + 216 + 25 + + + + + 1 + + + composite #9 + 578 + 266 + 94 + 20 + + true + + related display #12 + + + asynRecord.opi + + OctetAsyn + + tab + asynRecord + + + + 53 + 20 + + + + + + + text #15 + More + 58 + 3 + 36 + 15 + + + + + 1 + + + + menu #18 + $(P)$(SI)High.SCAN + 1114 + 66 + 20 + + + + + false + + + menu #21 + $(P)$(SI)Low.SCAN + 1114 + 91 + 20 + + + + + false + + + menu #24 + $(P)$(SI)HighLow.SCAN + 1114 + 116 + 20 + + + + + false + + + menu #27 + $(P)$(SI)LowHigh.SCAN + 1114 + 141 + 20 + + + + + false + + + menu #30 + $(P)$(WFIN)High.SCAN + 1114 + 166 + 20 + + + + + false + + + menu #33 + $(P)$(WFIN)Low.SCAN + 1114 + 191 + 20 + + + + + false + + + menu #36 + $(P)$(WFIN)HighLow.SCAN + 1114 + 216 + 20 + + + + + false + + + menu #39 + $(P)$(WFIN)LowHigh.SCAN + 1114 + 241 + 20 + + + + + false + + + text #42 + Scan + 1129 + 42 + 70 + + + + + 1 + + + composite #45 + 409 + 69 + 700 + 190 + + true + + text update #48 + $(P)$(SI)High + 700 + 15 + + + + + + + + + + + + + 1 + false + false + + + text update #52 + $(P)$(SI)Low + 25 + 700 + 15 + + + + + + + + + + + + + 1 + false + false + + + text update #56 + $(P)$(SI)HighLow + 50 + 700 + 15 + + + + + + + + + + + + + 1 + false + false + + + text update #60 + $(P)$(SI)LowHigh + 75 + 700 + 15 + + + + + + + + + + + + + 1 + false + false + + + text update #64 + $(P)$(WFIN)High + 100 + 700 + 15 + + + + + + + + + + + + + 6 + false + false + + + text update #68 + $(P)$(WFIN)Low + 125 + 700 + 15 + + + + + + + + + + + + + 6 + false + false + + + text update #72 + $(P)$(WFIN)HighLow + 150 + 700 + 15 + + + + + + + + + + + + + 6 + false + false + + + text update #76 + $(P)$(WFIN)LowHigh + 175 + 700 + 15 + + + + + + + + + + + + + 6 + false + false + + + + composite #80 + 164 + 66 + 240 + 195 + + true + + text entry #83 + $(P)$(SO)High + 240 + + + + + + + + + 1 + false + false + + + text entry #87 + $(P)$(SO)Low + 25 + 240 + + + + + + + + + 1 + false + false + + + text entry #91 + $(P)$(SO)HighLow + 50 + 240 + + + + + + + + + 1 + false + false + + + text entry #95 + $(P)$(SO)LowHigh + 75 + 240 + + + + + + + + + 1 + false + false + + + text entry #99 + $(P)$(WFOUT)High + 100 + 240 + + + + + + + + + 6 + false + false + + + text entry #103 + $(P)$(WFOUT)Low + 125 + 240 + + + + + + + + + 6 + false + false + + + text entry #107 + $(P)$(WFOUT)HighLow + 150 + 240 + + + + + + + + + 6 + false + false + + + text entry #111 + $(P)$(WFOUT)LowHigh + 175 + 240 + + + + + + + + + 6 + false + false + + + + composite #115 + 6 + 69 + 153 + 190 + + true + + text #118 + Stringout High + 27 + 126 + 15 + + + + + 2 + + + text #121 + Stringout Low + 36 + 25 + 117 + 15 + + + + + 2 + + + text #124 + Stringout HighLow + 50 + 153 + 15 + + + + + 2 + + + text #127 + Stringout LowHigh + 75 + 153 + 15 + + + + + 2 + + + text #130 + Waveform High + 36 + 100 + 117 + 15 + + + + + 2 + + + text #133 + Waveform Low + 45 + 125 + 108 + 15 + + + + + 2 + + + text #136 + Waveform HighLow + 9 + 150 + 144 + 15 + + + + + 2 + + + text #139 + Waveform LowHigh + 9 + 175 + 144 + 15 + + + + + 2 + + + + text #142 + Input records + 714 + 42 + 130 + + + + + 1 + + + text #145 + Output records + 213 + 42 + 140 + + + + + 1 + + diff --git a/modbusApp/op/bob/autoconvert/modbusStringTestTop.bob b/modbusApp/op/bob/autoconvert/modbusStringTestTop.bob new file mode 100644 index 0000000..dd81449 --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusStringTestTop.bob @@ -0,0 +1,53 @@ + + + modbusStringTestTop + 147 + 151 + 280 + 100 + + + + + false + 5 + + related display #6 + + + modbusStringTest.opi + +

SIM1:

+ SI + SO + WFIn + WFOut +
+ tab + Modbus String Test +
+
+ StringTest + 61 + 46 + 158 + 25 + + + + +
+ + text #9 + Modbus String Test Top + 8 + 10 + 264 + 25 + + + + + 1 + +
diff --git a/modbusApp/op/bob/autoconvert/modbusTestSyncIO.bob b/modbusApp/op/bob/autoconvert/modbusTestSyncIO.bob new file mode 100644 index 0000000..0150bbe --- /dev/null +++ b/modbusApp/op/bob/autoconvert/modbusTestSyncIO.bob @@ -0,0 +1,250 @@ + + + modbusTestSyncIO + 644 + 65 + 350 + 205 + + + + + false + 5 + + text #6 + SyncIO Test + 102 + 7 + 146 + 25 + + + + + 1 + + + related display #9 + + + asynRecord.opi + +

SIM1:

+ OctetAsyn +
+ tab + Octet driver +
+ + asynRecord.opi + +

SIM1:

+ InputAsyn +
+ tab + Modbus input driver +
+ + asynRecord.opi + +

SIM1:

+ OutputAsyn +
+ tab + Modbus output driver +
+ + asynRecord.opi + +

SIM1:

+ SyncIOAsyn +
+ tab + SyncIO driver +
+
+ asyn records + 115 + 175 + 120 + 20 + + + + +
+ + text #15 + Modbus input + 18 + 40 + 120 + + + + + 1 + + + text #18 + Modbus output + 8 + 65 + 130 + + + + + 1 + + + text #21 + SyncIO input + 18 + 90 + 120 + + + + + 1 + + + text #24 + SyncIO output + 8 + 115 + 130 + + + + + 1 + + + text update #27 + SIM1:LI:UINT16 + 148 + 40 + 80 + + + + + + + + + + + + + 1 + false + 1 + false + + + text update #31 + SIM1:SYNC_IN:INT32 + 148 + 90 + 80 + + + + + + + + + + + + + 1 + false + 1 + false + + + text entry #35 + SIM1:LO:UINT16 + 148 + 65 + 80 + + + + + + + + + 1 + false + false + + + text entry #39 + SIM1:SYNC_OUT:INT32 + 148 + 115 + 80 + + + + + + + + + 1 + false + false + + + menu #43 + SIM1:SYNC_IN:INT32.SCAN + 244 + 90 + 95 + 20 + + + + + false + + + text entry #46 + SIM1:LOCK_OUT:INT32 + 148 + 140 + 80 + + + + + + + + + 1 + false + false + + + text #50 + LockIO output + 8 + 140 + 130 + + + + + 1 + +
diff --git a/modbusApp/op/edl/autoconvert/Koyo1.edl b/modbusApp/op/edl/autoconvert/Koyo1.edl new file mode 100644 index 0000000..72aa022 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/Koyo1.edl @@ -0,0 +1,224 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 100 +y 100 +w 170 +h 145 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 12 +y 12 +w 146 +h 30 +font "utopia-medium-r-24.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Koyo 1" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 160 +h 85 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 160 +h 85 + +beginGroup + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 158 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Inputs" +numPvs 16 +numDsps 8 +displayFileName { + 0 Koyo_8inputs.edl + 1 Koyo_8inputs.edl + 2 Koyo_8inputs.edl + 3 Koyo_8inputs.edl + 4 Koyo_8inputs.edl + 5 Koyo_8inputs.edl + 6 Koyo_8inputs.edl + 7 Koyo_8inputs.edl +} +menuLabel { + 0 X0-X7 inputs (bit access) + 1 X0-X7 inputs (word access) + 2 Y0-Y7 inputs (bit access) + 3 Y0-Y7 inputs (word access) + 4 C0-C7 inputs (bit access) + 5 C0-C7 inputs (word access) + 6 C200-C207 inputs (bit access) + 7 C200-C207 inputs (word access) +} +symbols { + 0 "P=KOYO1:,R=X,A=B,L=X0L,PORT=XnB,AC=Bit" + 1 "P=KOYO1:,R=X,A=W,L=XnL,PORT=XnW,AC=Word" + 2 "P=KOYO1:,R=Y,A=InB,L=Y0InBL,PORT=YnInB,AC=Bit" + 3 "P=KOYO1:,R=Y,A=InW,L=YnInWL,PORT=YnInW,AC=Word" + 4 "P=KOYO1:,R=C,A=InB,L=C0InBL,PORT=CnInB,AC=Bit" + 5 "P=KOYO1:,R=C,A=InW,L=CnInWL,PORT=CnInW,AC=Word" + 6 "P=KOYO1:,R=C20,A=InB,L=C200InBL,PORT=CnInB,AC=Bit" + 7 "P=KOYO1:,R=C20,A=InW,L=C20nInWL,PORT=CnInW,AC=Word" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 + 3 1 + 4 1 + 5 1 + 6 1 + 7 1 +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 81 +w 158 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Outputs" +numPvs 8 +numDsps 4 +displayFileName { + 0 Koyo_8outputs.edl + 1 Koyo_8outputs.edl + 2 Koyo_8outputs.edl + 3 Koyo_8outputs.edl +} +menuLabel { + 0 Y0-Y7 outputs (bit access) + 1 Y0-Y7 outputs (word access) + 2 C200-C207 outputs (bit access) + 3 C200-C207 outputs (word access) +} +symbols { + 0 "P=KOYO1:,R=Y,A=OutB,L=Y0OutBL,PORT=YnOutB,AC=Bit" + 1 "P=KOYO1:,R=Y,A=OutW,L=YnOutWL,PORT=YnOutW,AC=Word" + 2 "P=KOYO1:,R=C20,A=OutB,L=C200OutBL,PORT=C20nOutB,AC=Bit" + 3 "P=KOYO1:,R=C20,A=OutW,L=C20nOutWL,PORT=CnOutW,AC=Word" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 + 3 1 +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 7 +y 111 +w 158 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Octet asyn record" +numPvs 4 +numDsps 2 +displayFileName { + 0 asynRecord.edl + 1 l +} +menuLabel { + 0 Octet asyn record + 1 +} +symbols { + 0 "P=KOYO1:,R=OctetAsyn" + 1 +} +replaceSymbols { + 0 1 + 1 1 +} +endObjectProperties + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/Koyo2.edl b/modbusApp/op/edl/autoconvert/Koyo2.edl new file mode 100644 index 0000000..8b03441 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/Koyo2.edl @@ -0,0 +1,200 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 100 +y 100 +w 170 +h 145 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 12 +y 12 +w 146 +h 30 +font "utopia-medium-r-24.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Koyo 2" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 160 +h 85 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 160 +h 85 + +beginGroup + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 160 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Inputs" +numPvs 8 +numDsps 4 +displayFileName { + 0 Koyo_8inputs.edl + 1 Koyo_8inputs.edl + 2 Koyo_8inputs.edl + 3 Koyo_4ADC.edl +} +menuLabel { + 0 Y0-Y7 inputs (bit access) + 1 C0-C7 inputs (bit access) + 2 C200-C207 inputs (bit access) + 3 ADCs +} +symbols { + 0 "P=KOYO2:,R=Y,A=InB,L=Y0InBL,PORT=YnInB,AC=Bit" + 1 "P=KOYO2:,R=C,A=InB,L=C0InBL,PORT=CnInB,AC=Bit" + 2 "P=KOYO2:,R=C20,A=InB,L=C200InBL,PORT=CnInB,AC=Bit" + 3 "P=KOYO2:,R1=ADC1,R2=ADC2,R3=ADC3,R4=ADC4,PORT=V3000InW" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 + 3 1 +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 81 +w 160 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Outputs" +numPvs 4 +numDsps 2 +displayFileName { + 0 Koyo_8outputs.edl + 1 Koyo_8outputs.edl +} +menuLabel { + 0 Y0-Y7 outputs (bit access) + 1 C200-C207 outputs (bit access) +} +symbols { + 0 "P=KOYO2:,R=Y,A=OutB,L=Y0OutBL,PORT=YnOutB,AC=Bit" + 1 "P=KOYO2:,R=C20,A=OutB,L=C200OutBL,PORT=C20nOutB,AC=Bit" +} +replaceSymbols { + 0 1 + 1 1 +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 111 +w 160 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Octet asyn record" +numPvs 4 +numDsps 2 +displayFileName { + 0 asynRecord.edl + 1 l +} +menuLabel { + 0 Octet asyn record + 1 +} +symbols { + 0 "P=KOYO2:,R=OctetAsyn" + 1 +} +replaceSymbols { + 0 1 + 1 1 +} +endObjectProperties + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/Koyo_4ADC.edl b/modbusApp/op/edl/autoconvert/Koyo_4ADC.edl new file mode 100644 index 0000000..a1e722d --- /dev/null +++ b/modbusApp/op/edl/autoconvert/Koyo_4ADC.edl @@ -0,0 +1,784 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 302 +y 70 +w 330 +h 260 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 55 +y 12 +w 220 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(P)$(R1)-$(R4) Inputs" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 87 +w 45 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R1)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 112 +w 45 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R2)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 137 +w 45 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R3)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 162 +w 45 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R4)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 111 +y 40 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "(ai records)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 75 +y 64 +w 47 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "RVAL" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 145 +y 64 +w 182 +h 115 + +beginGroup + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 145 +y 87 +w 75 +h 15 +controlPv "$(P)$(R1)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 145 +y 112 +w 75 +h 15 +controlPv "$(P)$(R2)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 145 +y 137 +w 75 +h 15 +controlPv "$(P)$(R3)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 145 +y 162 +w 75 +h 15 +controlPv "$(P)$(R4)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 227 +y 84 +w 100 +h 95 + +beginGroup + +endGroup + +endObjectProperties + + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 163 +y 64 +w 39 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "VAL" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 61 +y 87 +w 75 +h 15 +controlPv "$(P)$(R1).RVAL" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 61 +y 112 +w 75 +h 15 +controlPv "$(P)$(R2).RVAL" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 61 +y 137 +w 75 +h 15 +controlPv "$(P)$(R3).RVAL" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 61 +y 162 +w 75 +h 15 +controlPv "$(P)$(R4).RVAL" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 94 +y 185 +w 145 +h 20 + +beginGroup + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 94 +y 185 +w 50 +h 20 +controlPv "$(P)$(PORT)PollDelay" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 149 +y 188 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Poll delay" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 91 +y 210 +w 94 +h 20 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 146 +y 213 +w 43 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "More" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 69 +y 235 +w 134 +h 15 + +beginGroup + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 69 +y 235 +w 75 +h 15 +controlPv "$(P)$(R1).SEVR" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 149 +y 235 +w 54 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 145 +y 64 +w 182 +h 115 + +beginGroup +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 227 +y 84 +w 100 +h 95 + +beginGroup + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 227 +y 84 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R1).SCAN" +indicatorPv "$(P)$(R1).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 227 +y 109 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R2).SCAN" +indicatorPv "$(P)$(R2).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 227 +y 134 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R3).SCAN" +indicatorPv "$(P)$(R3).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 227 +y 159 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R4).SCAN" +indicatorPv "$(P)$(R4).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +endGroup + +endObjectProperties + + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 94 +y 185 +w 145 +h 20 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 91 +y 210 +w 94 +h 20 + +beginGroup + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 91 +y 210 +w 53 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-8.0" +icon +numPvs 6 +numDsps 3 +displayFileName { + 0 asynRecord.edl + 1 modbusStatistics.edl + 2 modbusArray.edl +} +menuLabel { + 0 asynRecord + 1 I/O Statistics + 2 Array +} +symbols { + 0 "P=$(P),R=$(PORT)Asyn" + 1 "P=$(P),R=$(PORT)" + 2 "P=$(P),R=$(PORT)Array" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 +} +endObjectProperties + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 69 +y 235 +w 134 +h 15 + +beginGroup + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/Koyo_8inputs.edl b/modbusApp/op/edl/autoconvert/Koyo_8inputs.edl new file mode 100644 index 0000000..385c142 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/Koyo_8inputs.edl @@ -0,0 +1,1860 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 453 +y 33 +w 400 +h 415 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 110 +y 5 +w 180 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)0-$(R)7 Inputs" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 87 +w 50 +h 15 +controlPv "$(P)$(R)0$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 112 +w 50 +h 15 +controlPv "$(P)$(R)1$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 137 +w 50 +h 15 +controlPv "$(P)$(R)2$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 162 +w 50 +h 15 +controlPv "$(P)$(R)3$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 187 +w 50 +h 15 +controlPv "$(P)$(R)4$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 212 +w 50 +h 15 +controlPv "$(P)$(R)5$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 237 +w 50 +h 15 +controlPv "$(P)$(R)6$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 262 +w 50 +h 15 +controlPv "$(P)$(R)7$(A)" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 40 +y 287 +w 171 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "(mbbiDirect record)" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 70 +y 312 +w 50 +h 15 +controlPv "$(P)$(L)" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 87 +w 50 +h 190 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 87 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)0" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 112 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)1" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 137 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)2" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 162 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)3" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 187 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)4" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 212 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)5" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 237 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)6" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 262 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)7" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 119 +y 35 +w 108 +h 35 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 128 +y 35 +w 91 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(AC) access" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 119 +y 55 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "(bi records)" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 8 +y 335 +w 235 +h 15 + +beginGroup + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 233 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B0" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 218 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B1" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 203 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B2" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 188 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B3" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 173 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B4" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 158 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B5" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 143 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B6" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 128 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B7" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 113 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B8" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 98 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).B9" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 83 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).BA" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 68 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).BB" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 53 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).BC" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 38 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).BD" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 23 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 8 +y 335 +w 10 +h 15 +controlPv "$(P)$(L).BF" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 84 +w 100 +h 245 + +beginGroup + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 232 +y 60 +w 160 +h 267 + +beginGroup + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 312 +w 75 +h 15 +controlPv "$(P)$(L).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 87 +w 75 +h 15 +controlPv "$(P)$(R)0$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 112 +w 75 +h 15 +controlPv "$(P)$(R)1$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 137 +w 75 +h 15 +controlPv "$(P)$(R)2$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 162 +w 75 +h 15 +controlPv "$(P)$(R)3$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 187 +w 75 +h 15 +controlPv "$(P)$(R)4$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 212 +w 75 +h 15 +controlPv "$(P)$(R)5$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 237 +w 75 +h 15 +controlPv "$(P)$(R)6$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 232 +y 262 +w 75 +h 15 +controlPv "$(P)$(R)7$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 234 +y 60 +w 70 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 87 +w 75 +h 15 +controlPv "$(P)$(R)0$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 112 +w 75 +h 15 +controlPv "$(P)$(R)1$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 137 +w 75 +h 15 +controlPv "$(P)$(R)2$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 162 +w 75 +h 15 +controlPv "$(P)$(R)3$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 187 +w 75 +h 15 +controlPv "$(P)$(R)4$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 212 +w 75 +h 15 +controlPv "$(P)$(R)5$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 237 +w 75 +h 15 +controlPv "$(P)$(R)6$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 262 +w 75 +h 15 +controlPv "$(P)$(R)7$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 315 +y 312 +w 75 +h 15 +controlPv "$(P)$(L).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 312 +y 60 +w 80 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Severity" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 126 +y 365 +w 148 +h 45 + +beginGroup + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 127 +y 365 +w 50 +h 20 +controlPv "$(P)$(PORT)PollDelay" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 184 +y 367 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Poll delay" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 181 +y 392 +w 43 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "More" +} +endObjectProperties + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 87 +w 50 +h 190 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 119 +y 35 +w 108 +h 35 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 8 +y 335 +w 235 +h 15 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 84 +w 100 +h 245 + +beginGroup + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 84 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)0$(A).SCAN" +indicatorPv "$(P)$(R)0$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 109 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)1$(A).SCAN" +indicatorPv "$(P)$(R)1$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 134 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)2$(A).SCAN" +indicatorPv "$(P)$(R)2$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 159 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)3$(A).SCAN" +indicatorPv "$(P)$(R)3$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 184 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)4$(A).SCAN" +indicatorPv "$(P)$(R)4$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 209 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)5$(A).SCAN" +indicatorPv "$(P)$(R)5$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 234 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)6$(A).SCAN" +indicatorPv "$(P)$(R)6$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 259 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)7$(A).SCAN" +indicatorPv "$(P)$(R)7$(A).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 127 +y 309 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(L).SCAN" +indicatorPv "$(P)$(L).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 232 +y 60 +w 160 +h 267 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 126 +y 365 +w 148 +h 45 + +beginGroup + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 126 +y 390 +w 53 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-8.0" +icon +numPvs 6 +numDsps 3 +displayFileName { + 0 asynRecord.edl + 1 modbusStatistics.edl + 2 modbusArray.edl +} +menuLabel { + 0 asynRecord + 1 I/O Statistics + 2 Array +} +symbols { + 0 "P=$(P),R=$(PORT)Asyn" + 1 "P=$(P),R=$(PORT)" + 2 "P=$(P),R=$(PORT)Array" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 +} +endObjectProperties + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/Koyo_8outputs.edl b/modbusApp/op/edl/autoconvert/Koyo_8outputs.edl new file mode 100644 index 0000000..ce66899 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/Koyo_8outputs.edl @@ -0,0 +1,1565 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 376 +y 141 +w 360 +h 450 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 15 +y 291 +w 171 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "(mbboDirect record)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 90 +y 5 +w 180 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)0-$(R)7 Outputs" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 87 +w 50 +h 190 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 87 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)0" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 112 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)1" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 137 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)2" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 162 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)3" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 187 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)4" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 212 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)5" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 237 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)6" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 5 +y 262 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(R)7" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 64 +y 38 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(AC) access" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 64 +y 58 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "(bo records)" +} +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 60 +y 312 +w 80 +h 20 +controlPv "$(P)$(L)" +format "hex" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 16 +y 339 +w 169 +h 43 + +beginGroup + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 121 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B0" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 140 +y 343 +w 49 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "B0-B7" +} +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 106 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B1" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 91 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B2" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 76 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B3" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 61 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B4" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 46 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B5" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 31 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B6" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 16 +y 339 +w 15 +h 20 +controlPv "$(P)$(L).B7" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 139 +y 363 +w 50 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "B8-BF" +} +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 121 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).B8" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 106 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).B9" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 91 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).BA" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 76 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).BB" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 61 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).BC" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 46 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).BD" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 31 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 16 +y 362 +w 15 +h 20 +controlPv "$(P)$(L).BF" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +endGroup + +endObjectProperties + + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 315 +w 75 +h 15 +controlPv "$(P)$(L).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 87 +w 75 +h 15 +controlPv "$(P)$(R)0$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 112 +w 75 +h 15 +controlPv "$(P)$(R)1$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 137 +w 75 +h 15 +controlPv "$(P)$(R)2$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 162 +w 75 +h 15 +controlPv "$(P)$(R)3$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 187 +w 75 +h 15 +controlPv "$(P)$(R)4$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 212 +w 75 +h 15 +controlPv "$(P)$(R)5$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 237 +w 75 +h 15 +controlPv "$(P)$(R)6$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 189 +y 262 +w 75 +h 15 +controlPv "$(P)$(R)7$(A).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 191 +y 60 +w 70 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 87 +w 75 +h 15 +controlPv "$(P)$(R)0$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 112 +w 75 +h 15 +controlPv "$(P)$(R)1$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 137 +w 75 +h 15 +controlPv "$(P)$(R)2$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 162 +w 75 +h 15 +controlPv "$(P)$(R)3$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 187 +w 75 +h 15 +controlPv "$(P)$(R)4$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 212 +w 75 +h 15 +controlPv "$(P)$(R)5$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 237 +w 75 +h 15 +controlPv "$(P)$(R)6$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 262 +w 75 +h 15 +controlPv "$(P)$(R)7$(A).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 272 +y 315 +w 75 +h 15 +controlPv "$(P)$(L).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 269 +y 60 +w 80 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Severity" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 133 +y 413 +w 94 +h 20 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 188 +y 416 +w 43 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "More" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 85 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)0$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 110 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)1$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 135 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)2$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 160 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)3$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 185 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)4$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 210 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)5$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 235 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)6$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 70 +y 260 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +selectColor rgb 29440 57088 65280 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)7$(A)" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 87 +w 50 +h 190 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 16 +y 339 +w 169 +h 43 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 133 +y 413 +w 94 +h 20 + +beginGroup + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 133 +y 413 +w 53 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-8.0" +icon +numPvs 4 +numDsps 2 +displayFileName { + 0 asynRecord.edl + 1 modbusStatistics.edl +} +menuLabel { + 0 asynRecord + 1 I/O Statistics +} +symbols { + 0 "P=$(P),R=$(PORT)Asyn" + 1 "P=$(P),R=$(PORT)" +} +replaceSymbols { + 0 1 + 1 1 +} +endObjectProperties + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/array_test.edl b/modbusApp/op/edl/autoconvert/array_test.edl new file mode 100644 index 0000000..c2ed33a --- /dev/null +++ b/modbusApp/op/edl/autoconvert/array_test.edl @@ -0,0 +1,111 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 446 +y 76 +w 250 +h 100 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 65 +y 7 +w 120 +h 25 +font "helvetica-medium-r-18.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Array Test" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 33 +y 58 +w 60 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Arrays" +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 98 +y 58 +w 120 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-12.0" +icon +buttonLabel "Arrays" +numPvs 8 +numDsps 4 +displayFileName { + 0 modbusArrayTest.edl + 1 modbusArrayTest.edl + 2 modbusArrayTest.edl + 3 modbusArrayTest.edl +} +menuLabel { + 0 UINT16 + 1 INT16 + 2 INT32_LE + 3 INT32_BE +} +symbols { + 0 "P=SIM1:,R=UINT16:" + 1 "P=SIM1:,R=INT16:" + 2 "P=SIM1:,R=INT32_LE:" + 3 "P=SIM1:,R=INT32_BE:" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 + 3 1 +} +endObjectProperties + diff --git a/modbusApp/op/edl/autoconvert/modbusArray.edl b/modbusApp/op/edl/autoconvert/modbusArray.edl new file mode 100644 index 0000000..5d12948 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusArray.edl @@ -0,0 +1,242 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 730 +y 175 +w 560 +h 315 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (X-Y Graph) +object xyGraphClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 5 +w 550 +h 275 +# Appearance +border +graphTitle "Array data for $(P)$(R)" +xLabel "Array index" +yLabel "Value" +fgColor rgb 0 0 0 +bgColor rgb 44544 44544 44544 +gridColor rgb 0 0 0 +font "helvetica-medium-r-10.0" +# Operating Modes +plotMode "plotLastNPts" +nPts 1 +# X axis properties +showXAxis +xAxisSrc "AutoScale" +xMin -9 +xMax 9 +xLablePrecision 1 +# Y axis properties +showYAxis +yAxisSrc "AutoScale" +yMin -9 +yMax 9 +# Trace Properties +numTraces 1 +yPv { + 0 "$(P)$(R)" +} +plotStyle { + 0 "point" +} +plotUpdateMode { + 0 "x" +} +plotSymbolType { + 0 "circle" +} +plotColor { + 0 rgb 2560 0 47104 +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 375 +y 287 +w 80 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Severity" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 460 +y 290 +w 75 +h 15 +controlPv "$(P)$(R).SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 214 +y 287 +w 60 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 279 +y 290 +w 75 +h 15 +controlPv "$(P)$(R).STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 20 +y 287 +w 167 +h 20 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 20 +y 290 +w 63 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Update:" +} +endObjectProperties + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 20 +y 287 +w 167 +h 20 + +beginGroup + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 87 +y 287 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R).SCAN" +indicatorPv "$(P)$(R).SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/modbusArrayTest.edl b/modbusApp/op/edl/autoconvert/modbusArrayTest.edl new file mode 100644 index 0000000..1283170 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusArrayTest.edl @@ -0,0 +1,339 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 499 +y 277 +w 560 +h 350 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (X-Y Graph) +object xyGraphClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 5 +w 550 +h 275 +# Appearance +border +graphTitle "Array data for $(P)$(R)" +xLabel "Array index" +yLabel "Value" +fgColor rgb 0 0 0 +bgColor rgb 44544 44544 44544 +gridColor rgb 0 0 0 +font "helvetica-medium-r-10.0" +# Operating Modes +plotMode "plotLastNPts" +nPts 1 +# X axis properties +showXAxis +xAxisSrc "AutoScale" +xMin -9 +xMax 9 +xLablePrecision 1 +# Y axis properties +showYAxis +yAxisSrc "AutoScale" +yMin -9 +yMax 9 +# Trace Properties +numTraces 1 +yPv { + 0 "$(P)$(R)ArrayIn" +} +plotStyle { + 0 "point" +} +plotUpdateMode { + 0 "x" +} +plotSymbolType { + 0 "circle" +} +plotColor { + 0 rgb 2560 0 47104 +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 375 +y 288 +w 80 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Severity" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 460 +y 291 +w 75 +h 15 +controlPv "$(P)$(R)ArrayIn.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 214 +y 288 +w 60 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 279 +y 291 +w 75 +h 15 +controlPv "$(P)$(R)ArrayIn.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 20 +y 288 +w 60 +h 20 +font "helvetica-medium-r-14.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Update" +} +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 117 +y 319 +w 50 +h 20 +controlPv "$(P)$(R)PollDelay" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 12 +y 319 +w 100 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Poll delay" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 194 +y 319 +w 120 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Poll trigger" +} +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 87 +y 288 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)ArrayIn.SCAN" +indicatorPv "$(P)$(R)ArrayIn.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 396 +y 319 +w 53 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-12.0" +icon +buttonLabel "More" +numPvs 6 +numDsps 3 +displayFileName { + 0 asynRecord.edl + 1 asynRecord.edl + 2 modbusStatistics.edl +} +menuLabel { + 0 asynRecord Out + 1 asynRecord In + 2 I/O Statistics +} +symbols { + 0 "P=$(P),R=A0:AsynOut" + 1 "P=$(P),R=A0:AsynIn" + 2 "P=$(P),R=A0:" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 +} +endObjectProperties + +# (Message Button) +object activeMessageButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 319 +y 319 +w 57 +h 20 +fgColor rgb 0 0 0 +onColor rgb 29440 57088 65280 +offColor rgb 29440 57088 65280 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)PollTrigger" +pressValue "1" +releaseValue +onLabel "Trigger" +offLabel "Trigger" +3d +useEnumNumeric +font "helvetica-medium-r-12.0" +endObjectProperties + diff --git a/modbusApp/op/edl/autoconvert/modbusDataTypes.edl b/modbusApp/op/edl/autoconvert/modbusDataTypes.edl new file mode 100644 index 0000000..b8d8049 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusDataTypes.edl @@ -0,0 +1,6034 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 331 +y 120 +w 725 +h 880 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 236 +y 12 +w 252 +h 25 +font "helvetica-medium-r-18.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Modbus Data Type Test" +} +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 291 +y 818 +w 50 +h 20 +controlPv "$(P)$(OUT)PollDelay" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 346 +y 821 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Poll delay" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 343 +y 846 +w 43 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "More" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 88 +w 75 +h 15 +controlPv "$(P)$(IN)UINT16" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 85 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT16" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 73 +y 88 +w 54 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt16" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 88 +w 75 +h 15 +controlPv "$(P)$(IN)UINT16.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 88 +w 75 +h 15 +controlPv "$(P)$(IN)UINT16.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 88 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT16.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 88 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT16.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 113 +w 75 +h 15 +controlPv "$(P)$(IN)BCD_UNSIGNED" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 110 +w 80 +h 20 +controlPv "$(P)$(OUT)BCD_UNSIGNED" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 37 +y 113 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt16 BCD" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 113 +w 75 +h 15 +controlPv "$(P)$(IN)BCD_UNSIGNED.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 113 +w 75 +h 15 +controlPv "$(P)$(IN)BCD_UNSIGNED.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 113 +w 75 +h 15 +controlPv "$(P)$(OUT)BCD_UNSIGNED.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 113 +w 75 +h 15 +controlPv "$(P)$(OUT)BCD_UNSIGNED.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 138 +w 75 +h 15 +controlPv "$(P)$(IN)BCD_SIGNED" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 135 +w 80 +h 20 +controlPv "$(P)$(OUT)BCD_SIGNED" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 46 +y 138 +w 81 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int16 BCD" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 138 +w 75 +h 15 +controlPv "$(P)$(IN)BCD_SIGNED.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 138 +w 75 +h 15 +controlPv "$(P)$(IN)BCD_SIGNED.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 138 +w 75 +h 15 +controlPv "$(P)$(OUT)BCD_SIGNED.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 138 +w 75 +h 15 +controlPv "$(P)$(OUT)BCD_SIGNED.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 188 +w 75 +h 15 +controlPv "$(P)$(IN)INT16" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 185 +w 80 +h 20 +controlPv "$(P)$(OUT)INT16" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 82 +y 188 +w 45 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int16" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 188 +w 75 +h 15 +controlPv "$(P)$(IN)INT16.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 188 +w 75 +h 15 +controlPv "$(P)$(IN)INT16.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 188 +w 75 +h 15 +controlPv "$(P)$(OUT)INT16.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 188 +w 75 +h 15 +controlPv "$(P)$(OUT)INT16.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 213 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 210 +w 80 +h 20 +controlPv "$(P)$(OUT)INT32_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 213 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 213 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 213 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 213 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 238 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 235 +w 80 +h 20 +controlPv "$(P)$(OUT)INT32_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 238 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 238 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 238 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 238 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 288 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 285 +w 80 +h 20 +controlPv "$(P)$(OUT)INT32_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 288 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 288 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 288 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 288 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 263 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 260 +w 80 +h 20 +controlPv "$(P)$(OUT)INT32_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 263 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 263 +w 75 +h 15 +controlPv "$(P)$(IN)INT32_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 263 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 263 +w 75 +h 15 +controlPv "$(P)$(OUT)INT32_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 313 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 310 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT32_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 313 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 313 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 313 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 313 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 338 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 335 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT32_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 338 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 338 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 338 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 338 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 388 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 385 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT32_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 388 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 388 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 388 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 388 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 363 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 360 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT32_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 363 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 363 +w 75 +h 15 +controlPv "$(P)$(IN)UINT32_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 363 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 363 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT32_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 413 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 410 +w 80 +h 20 +controlPv "$(P)$(OUT)INT64_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 413 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 413 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 413 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 413 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 438 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 435 +w 80 +h 20 +controlPv "$(P)$(OUT)INT64_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 438 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 438 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 438 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 438 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 488 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 485 +w 80 +h 20 +controlPv "$(P)$(OUT)INT64_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 488 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 488 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 488 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 488 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 463 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 460 +w 80 +h 20 +controlPv "$(P)$(OUT)INT64_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 463 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 463 +w 75 +h 15 +controlPv "$(P)$(IN)INT64_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 463 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 463 +w 75 +h 15 +controlPv "$(P)$(OUT)INT64_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 513 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 510 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT64_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 513 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 513 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 513 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 513 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 538 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 535 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT64_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 538 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 538 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 538 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 538 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 588 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 585 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT64_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 588 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 588 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 588 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 588 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 563 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 560 +w 80 +h 20 +controlPv "$(P)$(OUT)UINT64_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 563 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 563 +w 75 +h 15 +controlPv "$(P)$(IN)UINT64_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 563 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 563 +w 75 +h 15 +controlPv "$(P)$(OUT)UINT64_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 613 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 610 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT32_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 613 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 613 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 613 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 613 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 638 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 635 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT32_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 638 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 638 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 638 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 638 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 663 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 660 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT32_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 663 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 663 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 663 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 663 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 688 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 685 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT32_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 688 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 688 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT32_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 688 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 688 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT32_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 713 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 710 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT64_LE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 713 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 713 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 713 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_LE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 713 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_LE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 738 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 735 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT64_LE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 738 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 738 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 738 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_LE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 738 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_LE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 763 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 760 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT64_BE" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 763 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 763 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 763 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_BE.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 763 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_BE.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 788 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 785 +w 80 +h 20 +controlPv "$(P)$(OUT)FLOAT64_BE_BS" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 788 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 788 +w 75 +h 15 +controlPv "$(P)$(IN)FLOAT64_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 788 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_BE_BS.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 788 +w 75 +h 15 +controlPv "$(P)$(OUT)FLOAT64_BE_BS.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 377 +y 163 +w 75 +h 15 +controlPv "$(P)$(IN)INT16SM" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 132 +y 160 +w 80 +h 20 +controlPv "$(P)$(OUT)INT16SM" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 55 +y 163 +w 72 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int16 SM" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 457 +y 163 +w 75 +h 15 +controlPv "$(P)$(IN)INT16SM.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 537 +y 163 +w 75 +h 15 +controlPv "$(P)$(IN)INT16SM.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 217 +y 163 +w 75 +h 15 +controlPv "$(P)$(OUT)INT16SM.STAT" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 297 +y 163 +w 75 +h 15 +controlPv "$(P)$(OUT)INT16SM.SEVR" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 65535 0 +fgAlarm +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 659 +y 60 +w 47 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Scan" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 394 +y 60 +w 70 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(IREC)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 152 +y 60 +w 71 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "$(OREC)" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 479 +y 60 +w 60 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 549 +y 60 +w 80 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Severity" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 239 +y 60 +w 60 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Status" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 309 +y 60 +w 80 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Severity" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 28 +y 213 +w 99 +h 90 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 213 +w 72 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int32 LE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 238 +w 99 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int32 LE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 288 +w 99 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int32 BE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 263 +w 72 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int32 BE" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 19 +y 313 +w 108 +h 90 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 338 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt32 LE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 388 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt32 BE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 363 +w 81 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt32 BE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 313 +w 81 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt32 LE" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 28 +y 413 +w 99 +h 90 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 413 +w 72 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int64 LE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 438 +w 99 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int64 LE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 488 +w 99 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int64 BE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 28 +y 463 +w 72 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Int64 BE" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 19 +y 513 +w 108 +h 90 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 513 +w 81 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt64 LE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 538 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt64 LE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 588 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt64 BE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 19 +y 563 +w 81 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "UInt64 BE" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 613 +w 117 +h 190 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 613 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float32 LE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 638 +w 117 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float32 LE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 663 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float32 BE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 688 +w 117 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float32 BE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 713 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float64 LE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 738 +w 117 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float64 LE BS" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 763 +w 90 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float64 BE" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 788 +w 117 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Float64 BE BS" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 815 +w 153 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "LE: Little-endian" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 835 +w 126 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "BE: Big-endian" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 855 +w 144 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "BS: Byte-swapped" +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 288 +y 843 +w 53 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-8.0" +icon +numPvs 6 +numDsps 3 +displayFileName { + 0 "asynRecord.edl" + 1 "asynRecord.edl" + 2 "modbusStatistics.edl" +} +menuLabel { + 0 "asynRecord Out" + 1 "asynRecord In" + 2 "I/O Statistics" +} +symbols { + 0 "P=$(P),R=$(OUT)AsynOut" + 1 "P=$(P),R=$(OUT)AsynIn" + 2 "P=$(P),R=$(OUT)" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 +} +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 85 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT16.SCAN" +indicatorPv "$(P)$(IN)UINT16.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 110 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)BCD_UNSIGNED.SCAN" +indicatorPv "$(P)$(IN)BCD_UNSIGNED.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 135 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)BCD_SIGNED.SCAN" +indicatorPv "$(P)$(IN)BCD_SIGNED.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 185 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT16.SCAN" +indicatorPv "$(P)$(IN)INT16.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 210 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT32_LE.SCAN" +indicatorPv "$(P)$(IN)INT32_LE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 235 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT32_LE_BS.SCAN" +indicatorPv "$(P)$(IN)INT32_LE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 285 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT32_BE_BS.SCAN" +indicatorPv "$(P)$(IN)INT32_BE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 260 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT32_BE.SCAN" +indicatorPv "$(P)$(IN)INT32_BE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 310 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT32_LE.SCAN" +indicatorPv "$(P)$(IN)UINT32_LE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 335 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT32_LE_BS.SCAN" +indicatorPv "$(P)$(IN)UINT32_LE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 385 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT32_BE_BS.SCAN" +indicatorPv "$(P)$(IN)UINT32_BE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 360 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT32_BE.SCAN" +indicatorPv "$(P)$(IN)UINT32_BE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 410 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT64_LE.SCAN" +indicatorPv "$(P)$(IN)INT64_LE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 435 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT64_LE_BS.SCAN" +indicatorPv "$(P)$(IN)INT64_LE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 485 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT64_BE_BS.SCAN" +indicatorPv "$(P)$(IN)INT64_BE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 460 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT64_BE.SCAN" +indicatorPv "$(P)$(IN)INT64_BE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 510 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT64_LE.SCAN" +indicatorPv "$(P)$(IN)UINT64_LE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 535 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT64_LE_BS.SCAN" +indicatorPv "$(P)$(IN)UINT64_LE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 585 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT64_BE_BS.SCAN" +indicatorPv "$(P)$(IN)UINT64_BE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 560 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)UINT64_BE.SCAN" +indicatorPv "$(P)$(IN)UINT64_BE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 610 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT32_LE.SCAN" +indicatorPv "$(P)$(IN)FLOAT32_LE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 635 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT32_LE_BS.SCAN" +indicatorPv "$(P)$(IN)FLOAT32_LE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 660 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT32_BE.SCAN" +indicatorPv "$(P)$(IN)FLOAT32_BE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 685 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT32_BE_BS.SCAN" +indicatorPv "$(P)$(IN)FLOAT32_BE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 710 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT64_LE.SCAN" +indicatorPv "$(P)$(IN)FLOAT64_LE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 735 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT64_LE_BS.SCAN" +indicatorPv "$(P)$(IN)FLOAT64_LE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 760 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT64_BE.SCAN" +indicatorPv "$(P)$(IN)FLOAT64_BE.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 785 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)FLOAT64_BE_BS.SCAN" +indicatorPv "$(P)$(IN)FLOAT64_BE_BS.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 617 +y 160 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(IN)INT16SM.SCAN" +indicatorPv "$(P)$(IN)INT16SM.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 28 +y 213 +w 99 +h 90 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 19 +y 313 +w 108 +h 90 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 28 +y 413 +w 99 +h 90 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 19 +y 513 +w 108 +h 90 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 613 +w 117 +h 190 + +beginGroup + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/modbusDataTypesTest.edl b/modbusApp/op/edl/autoconvert/modbusDataTypesTest.edl new file mode 100644 index 0000000..a5f183e --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusDataTypesTest.edl @@ -0,0 +1,132 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 100 +y 100 +w 170 +h 120 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 12 +y 12 +w 146 +h 25 +font "helvetica-medium-r-18.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Sim1 Test" +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 51 +w 158 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Inputs & outputs" +numPvs 10 +numDsps 5 +displayFileName { + 0 "modbusDataTypes.edl" + 1 "modbusDataTypes.edl" + 2 "modbusDataTypes.edl" + 3 "Koyo_8inputs.edl" + 4 "Koyo_8outputs.edl" +} +menuLabel { + 0 "longout/longin" + 1 "int64out/int64in" + 2 "ao/ai" + 3 "Binary inputs" + 4 "Binary outputs" +} +symbols { + 0 "P=SIM1:,OUT=LO:,IN=LI:,OREC=longout,IREC=longin" + 1 "P=SIM1:,OUT=I64O:,IN=I64I:,OREC=int64out,IREC=int64in" + 2 "P=SIM1:,OUT=AO:,IN=AI:,OREC=ao,IREC=ai" + 3 "P=SIM1:,R=BI,A=B,L=MBBID0,PORT=BI,AC=Bit" + 4 "P=SIM1:,R=BO,A=B,L=MBBOD0,PORT=BO,AC=Bit" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 + 3 1 + 4 1 +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 7 +y 81 +w 158 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "Octet asyn record" +numPvs 4 +numDsps 2 +displayFileName { + 0 "asynRecord.edl" + 1 "l" +} +menuLabel { + 0 "Octet asyn record" + 1 "" +} +symbols { + 0 "P=SIM1:,R=OctetAsyn" + 1 +} +replaceSymbols { + 0 1 + 1 1 +} +endObjectProperties + diff --git a/modbusApp/op/edl/autoconvert/modbusStatistics.edl b/modbusApp/op/edl/autoconvert/modbusStatistics.edl new file mode 100644 index 0000000..c9e62ae --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusStatistics.edl @@ -0,0 +1,525 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 730 +y 50 +w 560 +h 375 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (X-Y Graph) +object xyGraphClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 5 +y 5 +w 550 +h 275 +# Appearance +border +graphTitle "Histogram of cycle times $(P)$(R)" +xLabel "Write/read cycle time (msec)" +yLabel "Number of events" +fgColor rgb 0 0 0 +bgColor rgb 44544 44544 44544 +gridColor rgb 0 0 0 +font "helvetica-medium-r-10.0" +# Operating Modes +plotMode "plotLastNPts" +nPts 1 +# X axis properties +showXAxis +xAxisSrc "AutoScale" +xMin -9 +xMax 9 +xLablePrecision 1 +# Y axis properties +showYAxis +yAxisSrc "AutoScale" +yMin -9 +yMax 9 +# Trace Properties +numTraces 1 +xPv { + 0 "$(P)$(R)HistTimeAxis" +} +yPv { + 0 "$(P)$(R)Hist" +} +plotStyle { + 0 "point" +} +plotUpdateMode { + 0 "x" +} +plotSymbolType { + 0 "circle" +} +plotColor { + 0 rgb 2560 0 47104 +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 289 +w 189 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Enable histogramming:" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 370 +y 289 +w 63 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Update:" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 11 +y 309 +w 86 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "msec per bin" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 329 +w 542 +h 36 + +beginGroup + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 329 +w 145 +h 15 + +beginGroup + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 85 +y 329 +w 70 +h 15 +controlPv "$(P)$(R)ReadOK" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 329 +w 72 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Read OK:" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 251 +y 329 +w 70 +h 15 +controlPv "$(P)$(R)WriteOK" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 165 +y 329 +w 81 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Write OK:" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 445 +y 329 +w 70 +h 15 +controlPv "$(P)$(R)IOErrors" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 342 +y 329 +w 99 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "I/O Errors:" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 350 +w 265 +h 15 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 10 +y 350 +w 189 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Last I/O Time (msec):" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 205 +y 350 +w 70 +h 15 +controlPv "$(P)$(R)LastIOTime" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +endGroup + +endObjectProperties + + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 287 +y 350 +w 189 +h 15 +font "helvetica-medium-r-12.0" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Max. I/O Time (msec):" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 482 +y 350 +w 70 +h 15 +controlPv "$(P)$(R)MaxIOTime" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +endGroup + +endObjectProperties + + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 129 +y 309 +w 78 +h 15 +controlPv "$(P)$(R)MsPerBin" +format "decimal" +font "helvetica-medium-r-8.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Choice Button) +object activeChoiceButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 202 +y 286 +w 150 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 19968 42240 63744 +selectColor rgb 19968 42240 63744 +inconsistentColor rgb 0 0 0 +topShadowColor rgb 65280 65280 65280 +botShadowColor rgb 0 0 0 +controlPv "$(P)$(R)HistEnable" +font "helvetica-medium-r-10.0" +orientation "horizontal" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 437 +y 286 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(R)Statistics.SCAN" +indicatorPv "$(P)$(R)Statistics.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 329 +w 542 +h 36 + +beginGroup +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 329 +w 145 +h 15 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 10 +y 350 +w 265 +h 15 + +beginGroup + +endGroup + +endObjectProperties + + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/modbusStringTest.edl b/modbusApp/op/edl/autoconvert/modbusStringTest.edl new file mode 100644 index 0000000..6cd53b8 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusStringTest.edl @@ -0,0 +1,1018 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 79 +y 100 +w 1220 +h 300 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 502 +y 12 +w 216 +h 25 +font "helvetica-medium-r-18.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Modbus String Test" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 578 +y 266 +w 94 +h 20 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 633 +y 269 +w 43 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "More" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 1129 +y 42 +w 70 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Scan" +} +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 409 +y 69 +w 700 +h 190 + +beginGroup + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 69 +w 700 +h 15 +controlPv "$(P)$(SI)High" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 94 +w 700 +h 15 +controlPv "$(P)$(SI)Low" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 119 +w 700 +h 15 +controlPv "$(P)$(SI)HighLow" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 144 +w 700 +h 15 +controlPv "$(P)$(SI)LowHigh" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 169 +w 700 +h 15 +controlPv "$(P)$(WFIN)High" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 194 +w 700 +h 15 +controlPv "$(P)$(WFIN)Low" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 219 +w 700 +h 15 +controlPv "$(P)$(WFIN)HighLow" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 409 +y 244 +w 700 +h 15 +controlPv "$(P)$(WFIN)LowHigh" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 10752 25344 58368 +bgColor rgb 55808 55808 55808 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 164 +y 66 +w 240 +h 195 + +beginGroup + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 66 +w 240 +h 20 +controlPv "$(P)$(SO)High" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 91 +w 240 +h 20 +controlPv "$(P)$(SO)Low" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 116 +w 240 +h 20 +controlPv "$(P)$(SO)HighLow" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 141 +w 240 +h 20 +controlPv "$(P)$(SO)LowHigh" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 166 +w 240 +h 20 +controlPv "$(P)$(WFOUT)High" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 191 +w 240 +h 20 +controlPv "$(P)$(WFOUT)Low" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 216 +w 240 +h 20 +controlPv "$(P)$(WFOUT)HighLow" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 164 +y 241 +w 240 +h 20 +controlPv "$(P)$(WFOUT)LowHigh" +format "string" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +endGroup + +endObjectProperties + + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 6 +y 69 +w 153 +h 190 + +beginGroup + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 33 +y 69 +w 126 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Stringout High" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 42 +y 94 +w 117 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Stringout Low" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 6 +y 119 +w 153 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Stringout HighLow" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 6 +y 144 +w 153 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Stringout LowHigh" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 42 +y 169 +w 117 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Waveform High" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 51 +y 194 +w 108 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Waveform Low" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 15 +y 219 +w 144 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Waveform HighLow" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 15 +y 244 +w 144 +h 15 +font "helvetica-medium-r-12.0" +fontAlign "right" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Waveform LowHigh" +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 714 +y 42 +w 130 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Input records" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 213 +y 42 +w 140 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Output records" +} +endObjectProperties +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 578 +y 266 +w 94 +h 20 + +beginGroup + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 578 +y 266 +w 53 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-8.0" +icon +numPvs 2 +numDsps 1 +displayFileName { + 0 asynRecord.edl +} +menuLabel { + 0 asynRecord +} +symbols { + 0 "P=$(P),R=OctetAsyn" +} +replaceSymbols { + 0 1 +} +endObjectProperties + +endGroup + +endObjectProperties + + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 66 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(SI)High.SCAN" +indicatorPv "$(P)$(SI)High.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 91 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(SI)Low.SCAN" +indicatorPv "$(P)$(SI)Low.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 116 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(SI)HighLow.SCAN" +indicatorPv "$(P)$(SI)HighLow.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 141 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(SI)LowHigh.SCAN" +indicatorPv "$(P)$(SI)LowHigh.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 166 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(WFIN)High.SCAN" +indicatorPv "$(P)$(WFIN)High.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 191 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(WFIN)Low.SCAN" +indicatorPv "$(P)$(WFIN)Low.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 216 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(WFIN)HighLow.SCAN" +indicatorPv "$(P)$(WFIN)HighLow.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 1114 +y 241 +w 100 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "$(P)$(WFIN)LowHigh.SCAN" +indicatorPv "$(P)$(WFIN)LowHigh.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 409 +y 69 +w 700 +h 190 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 164 +y 66 +w 240 +h 195 + +beginGroup + +endGroup + +endObjectProperties + +# (Group) +object activeGroupClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 6 +y 69 +w 153 +h 190 + +beginGroup + +endGroup + +endObjectProperties + + diff --git a/modbusApp/op/edl/autoconvert/modbusStringTestTop.edl b/modbusApp/op/edl/autoconvert/modbusStringTestTop.edl new file mode 100644 index 0000000..94f0972 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusStringTestTop.edl @@ -0,0 +1,79 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 147 +y 151 +w 280 +h 100 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 8 +y 10 +w 264 +h 25 +font "helvetica-medium-r-18.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Modbus String Test Top" +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 61 +y 46 +w 158 +h 25 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-14.0" +icon +buttonLabel "StringTest" +numPvs 2 +numDsps 1 +displayFileName { + 0 modbusStringTest.edl +} +menuLabel { + 0 Modbus String Test +} +symbols { + 0 "P=SIM1:,SO=SO,SI=SI,WFOUT=WFOut,WFIN=WFIn" +} +replaceSymbols { + 0 1 +} +endObjectProperties + diff --git a/modbusApp/op/edl/autoconvert/modbusTestSyncIO.edl b/modbusApp/op/edl/autoconvert/modbusTestSyncIO.edl new file mode 100644 index 0000000..a9fc117 --- /dev/null +++ b/modbusApp/op/edl/autoconvert/modbusTestSyncIO.edl @@ -0,0 +1,337 @@ +4 0 1 +beginScreenProperties +major 4 +minor 0 +release 1 +x 644 +y 65 +w 350 +h 205 +font "helvetica-medium-r-18.0" +ctlFont "helvetica-bold-r-10.0" +btnFont "helvetica-medium-r-18.0" +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +textColor rgb 0 0 0 +ctlFgColor1 rgb 64256 62208 18944 +ctlFgColor2 rgb 60928 46592 11008 +ctlBgColor1 rgb 52480 24832 0 +ctlBgColor2 rgb 65280 45056 65280 +topShadowColor rgb 44544 19968 48128 +botShadowColor rgb 13312 13056 34304 +showGrid +snapToGrid +gridSize 4 +endScreenProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 102 +y 7 +w 146 +h 25 +font "helvetica-medium-r-18.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "SyncIO Test" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 18 +y 40 +w 120 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Modbus input" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 8 +y 65 +w 130 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "Modbus output" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 18 +y 90 +w 120 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "SyncIO input" +} +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 8 +y 115 +w 130 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "SyncIO output" +} +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 148 +y 40 +w 80 +h 20 +controlPv "SIM1:LI:UINT16" +format "decimal" +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 2560 0 47104 +bgColor rgb 47872 47872 47872 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Monitor) +object activeXTextDspClass:noedit +beginObjectProperties +major 4 +minor 7 +release 0 +x 148 +y 90 +w 80 +h 20 +controlPv "SIM1:SYNC_IN:INT32" +format "decimal" +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 2560 0 47104 +bgColor rgb 47872 47872 47872 +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 148 +y 65 +w 80 +h 20 +controlPv "SIM1:LO:UINT16" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 148 +y 115 +w 80 +h 20 +controlPv "SIM1:SYNC_OUT:INT32" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Text Control) +object activeXTextDspClass +beginObjectProperties +major 4 +minor 7 +release 0 +x 148 +y 140 +w 80 +h 20 +controlPv "SIM1:LOCK_OUT:INT32" +format "decimal" +font "helvetica-medium-r-12.0" +fontAlign "left" +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +editable +motifWidget +limitsFromDb +nullColor rgb 60928 46592 11008 +smartRefresh +fastUpdate +newPos +objType "controls" +endObjectProperties + +# (Static Text) +object activeXTextClass +beginObjectProperties +major 4 +minor 1 +release 1 +x 8 +y 140 +w 130 +h 20 +font "helvetica-medium-r-14.0" +fontAlign "center" +fgColor rgb 0 0 0 +bgColor index 3 +useDisplayBg +value { + "LockIO output" +} +endObjectProperties + +# (Related Display) +object relatedDisplayClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 115 +y 175 +w 120 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 29440 57088 65280 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +font "helvetica-medium-r-12.0" +icon +buttonLabel "asyn records" +numPvs 8 +numDsps 4 +displayFileName { + 0 asynRecord.edl + 1 asynRecord.edl + 2 asynRecord.edl + 3 asynRecord.edl +} +menuLabel { + 0 Octet driver + 1 Modbus input driver + 2 Modbus output driver + 3 SyncIO driver +} +symbols { + 0 "P=SIM1:,R=OctetAsyn" + 1 "P=SIM1:,R=InputAsyn" + 2 "P=SIM1:,R=OutputAsyn" + 3 "P=SIM1:,R=SyncIOAsyn" +} +replaceSymbols { + 0 1 + 1 1 + 2 1 + 3 1 +} +endObjectProperties + +# (Menu Button) +object activeMenuButtonClass +beginObjectProperties +major 4 +minor 0 +release 0 +x 244 +y 90 +w 95 +h 20 +fgColor rgb 0 0 0 +bgColor rgb 47872 47872 47872 +inconsistentColor rgb 17920 17920 17920 +topShadowColor rgb 55808 55808 55808 +botShadowColor rgb 17920 17920 17920 +controlPv "SIM1:SYNC_IN:INT32.SCAN" +indicatorPv "SIM1:SYNC_IN:INT32.SCAN" +font "helvetica-medium-r-12.0" +endObjectProperties + diff --git a/modbusApp/op/opi/Koyo1.opi b/modbusApp/op/opi/autoconvert/Koyo1.opi similarity index 84% rename from modbusApp/op/opi/Koyo1.opi rename to modbusApp/op/opi/autoconvert/Koyo1.opi index 0aee83f..d1cffe8 100644 --- a/modbusApp/op/opi/Koyo1.opi +++ b/modbusApp/op/opi/autoconvert/Koyo1.opi @@ -1,433 +1,434 @@ - - false - - true - - 39872d87:13e14015f61:-3df5 - 3.1.2.20120830 - - true - 145 - Koyo1 - false - false - - - - - - - Display - true - 170 - - true - 5 - - false - -1 - -1 - - - 100 - 100 - - - true - - true - 39872d87:13e14015f61:-3df3 - - 85 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 160 - 0 - - false - 1 - - - - - 51 - - 5 - - false - true - false - 39872d87:13e14015f61:-3df2 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 158 - 6 - - - - 1 - - - - 0 - - - Koyo_8inputs.opi - - true -

KOYO1:

- X - B - X0L - XnB - Bit -
- 0 - X0-X7 inputs (bit access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- X - W - XnL - XnW - Word -
- 0 - X0-X7 inputs (word access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- Y - InB - Y0InBL - YnInB - Bit -
- 0 - Y0-Y7 inputs (bit access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- Y - InW - YnInWL - YnInW - Word -
- 0 - Y0-Y7 inputs (word access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- C - InB - C0InBL - CnInB - Bit -
- 0 - C0-C7 inputs (bit access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- C - InW - CnInWL - CnInW - Word -
- 0 - C0-C7 inputs (word access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- C20 - InB - C200InBL - CnInB - Bit -
- 0 - C200-C207 inputs (bit access) -
- - Koyo_8inputs.opi - - true -

KOYO1:

- C20 - InW - C20nInWL - CnInW - Word -
- 0 - C200-C207 inputs (word access) -
-
- $(pv_name) -$(pv_value) - 0 -
- - false - true - false - 39872d87:13e14015f61:-3df1 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 158 - 6 - - - - 1 - - - - 30 - - - Koyo_8outputs.opi - - true -

KOYO1:

- Y - OutB - Y0OutBL - YnOutB - Bit -
- 0 - Y0-Y7 outputs (bit access) -
- - Koyo_8outputs.opi - - true -

KOYO1:

- Y - OutW - YnOutWL - YnOutW - Word -
- 0 - Y0-Y7 outputs (word access) -
- - Koyo_8outputs.opi - - true -

KOYO1:

- C20 - OutB - C200OutBL - C20nOutB - Bit -
- 0 - C200-C207 outputs (bit access) -
- - Koyo_8outputs.opi - - true -

KOYO1:

- C20 - OutW - C20nOutWL - CnOutW - Word -
- 0 - C200-C207 outputs (word access) -
-
- $(pv_name) -$(pv_value) - 0 -
- - false - true - false - 39872d87:13e14015f61:-3df0 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 158 - 6 - - - - 1 - - - - 60 - - - asynRecord.opi - - true -

KOYO1:

- OctetAsyn -
- 0 - Octet asyn record -
- - - - true - - 0 - - -
- $(pv_name) -$(pv_value) - 2 -
-
- - true - 1 - 39872d87:13e14015f61:-3df4 - false - - 30 - Label - - true - true - false - - true - false - - - - - - - Label - true - Koyo 1 - - - - 146 - 0 - - 1 - - - - 1 - - 12 - true - - 12 - -
\ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 145 + + true + + Koyo1 + + + true + true + false + true + false + Display + 170 + 100 + 100 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 85 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 160 + 5 + 51 + + + + Koyo_8inputs.opi + + true +

KOYO1:

+ X + B + X0L + XnB + Bit +
+ 1 + X0-X7 inputs (bit access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ X + W + XnL + XnW + Word +
+ 1 + X0-X7 inputs (word access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ Y + InB + Y0InBL + YnInB + Bit +
+ 1 + Y0-Y7 inputs (bit access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ Y + InW + YnInWL + YnInW + Word +
+ 1 + Y0-Y7 inputs (word access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ C + InB + C0InBL + CnInB + Bit +
+ 1 + C0-C7 inputs (bit access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ C + InW + CnInWL + CnInW + Word +
+ 1 + C0-C7 inputs (word access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ C20 + InB + C200InBL + CnInB + Bit +
+ 1 + C200-C207 inputs (bit access) +
+ + Koyo_8inputs.opi + + true +

KOYO1:

+ C20 + InW + C20nInWL + CnInW + Word +
+ 1 + C200-C207 inputs (word access) +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 158 + 0 + 0 +
+ + + + Koyo_8outputs.opi + + true +

KOYO1:

+ Y + OutB + Y0OutBL + YnOutB + Bit +
+ 1 + Y0-Y7 outputs (bit access) +
+ + Koyo_8outputs.opi + + true +

KOYO1:

+ Y + OutW + YnOutWL + YnOutW + Word +
+ 1 + Y0-Y7 outputs (word access) +
+ + Koyo_8outputs.opi + + true +

KOYO1:

+ C20 + OutB + C200OutBL + C20nOutB + Bit +
+ 1 + C200-C207 outputs (bit access) +
+ + Koyo_8outputs.opi + + true +

KOYO1:

+ C20 + OutW + C20nOutWL + CnOutW + Word +
+ 1 + C200-C207 outputs (word access) +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 158 + 0 + 30 +
+ + + + asynRecord.opi + + true +

KOYO1:

+ OctetAsyn +
+ 1 + Octet asyn record +
+ + + + true + + 1 + + +
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 158 + 2 + 60 +
+
+ + + false + + + + + + + 0 + 1 + true + + + + + + + 30 + 1 + Label + + + true + true + false + + + false + Koyo 1 + + true + 1 + true + Label + 146 + false + 12 + 12 + +
diff --git a/modbusApp/op/opi/Koyo2.opi b/modbusApp/op/opi/autoconvert/Koyo2.opi similarity index 82% rename from modbusApp/op/opi/Koyo2.opi rename to modbusApp/op/opi/autoconvert/Koyo2.opi index 4bb9769..b920e40 100644 --- a/modbusApp/op/opi/Koyo2.opi +++ b/modbusApp/op/opi/autoconvert/Koyo2.opi @@ -1,349 +1,350 @@ - - false - - true - - 39872d87:13e14015f61:-3de8 - 3.1.2.20120830 - - true - 145 - Koyo2 - false - false - - - - - - - Display - true - 170 - - true - 5 - - false - -1 - -1 - - - 100 - 100 - - - true - - true - 39872d87:13e14015f61:-3de6 - - 85 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 160 - 0 - - false - 1 - - - - - 51 - - 5 - - false - true - false - 39872d87:13e14015f61:-3de5 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 160 - 6 - - - - 1 - - - - 0 - - - Koyo_8inputs.opi - - true -

KOYO2:

- Y - InB - Y0InBL - YnInB - Bit -
- 0 - Y0-Y7 inputs (bit access) -
- - Koyo_8inputs.opi - - true -

KOYO2:

- C - InB - C0InBL - CnInB - Bit -
- 0 - C0-C7 inputs (bit access) -
- - Koyo_8inputs.opi - - true -

KOYO2:

- C20 - InB - C200InBL - CnInB - Bit -
- 0 - C200-C207 inputs (bit access) -
- - Koyo_4ADC.opi - - true -

KOYO2:

- ADC1 - ADC2 - ADC3 - ADC4 - V3000InW -
- 0 - ADCs -
-
- $(pv_name) -$(pv_value) - 0 -
- - false - true - false - 39872d87:13e14015f61:-3de4 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 160 - 6 - - - - 1 - - - - 30 - - - Koyo_8outputs.opi - - true -

KOYO2:

- Y - OutB - Y0OutBL - YnOutB - Bit -
- 0 - Y0-Y7 outputs (bit access) -
- - Koyo_8outputs.opi - - true -

KOYO2:

- C20 - OutB - C200OutBL - C20nOutB - Bit -
- 0 - C200-C207 outputs (bit access) -
-
- $(pv_name) -$(pv_value) - 0 -
- - false - true - false - 39872d87:13e14015f61:-3de3 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 160 - 6 - - - - 1 - - - - 60 - - - asynRecord.opi - - true -

KOYO2:

- OctetAsyn -
- 0 - Octet asyn record -
- - - - true - - 0 - - -
- $(pv_name) -$(pv_value) - 0 -
-
- - true - 1 - 39872d87:13e14015f61:-3de7 - false - - 30 - Label - - true - true - false - - true - false - - - - - - - Label - true - Koyo 2 - - - - 146 - 0 - - 1 - - - - 1 - - 12 - true - - 12 - -
\ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 145 + + true + + Koyo2 + + + true + true + false + true + false + Display + 170 + 100 + 100 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 85 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 160 + 5 + 51 + + + + Koyo_8inputs.opi + + true +

KOYO2:

+ Y + InB + Y0InBL + YnInB + Bit +
+ 1 + Y0-Y7 inputs (bit access) +
+ + Koyo_8inputs.opi + + true +

KOYO2:

+ C + InB + C0InBL + CnInB + Bit +
+ 1 + C0-C7 inputs (bit access) +
+ + Koyo_8inputs.opi + + true +

KOYO2:

+ C20 + InB + C200InBL + CnInB + Bit +
+ 1 + C200-C207 inputs (bit access) +
+ + Koyo_4ADC.opi + + true +

KOYO2:

+ ADC1 + ADC2 + ADC3 + ADC4 + V3000InW +
+ 1 + ADCs +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 160 + 0 + 0 +
+ + + + Koyo_8outputs.opi + + true +

KOYO2:

+ Y + OutB + Y0OutBL + YnOutB + Bit +
+ 1 + Y0-Y7 outputs (bit access) +
+ + Koyo_8outputs.opi + + true +

KOYO2:

+ C20 + OutB + C200OutBL + C20nOutB + Bit +
+ 1 + C200-C207 outputs (bit access) +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 160 + 0 + 30 +
+ + + + asynRecord.opi + + true +

KOYO2:

+ OctetAsyn +
+ 1 + Octet asyn record +
+ + + + true + + 1 + + +
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 160 + 0 + 60 +
+
+ + + false + + + + + + + 0 + 1 + true + + + + + + + 30 + 1 + Label + + + true + true + false + + + false + Koyo 2 + + true + 1 + true + Label + 146 + false + 12 + 12 + +
diff --git a/modbusApp/op/opi/Koyo_4ADC.opi b/modbusApp/op/opi/autoconvert/Koyo_4ADC.opi similarity index 81% rename from modbusApp/op/opi/Koyo_4ADC.opi rename to modbusApp/op/opi/autoconvert/Koyo_4ADC.opi index 53bbaa1..d0e2638 100644 --- a/modbusApp/op/opi/Koyo_4ADC.opi +++ b/modbusApp/op/opi/autoconvert/Koyo_4ADC.opi @@ -1,1443 +1,1442 @@ - - false - - true - - 39872d87:13e14015f61:-3ddb - 3.1.2.20120830 - - true - 260 - Koyo_4ADC - false - false - - - - - - - Display - true - 330 - - true - 5 - - false - -1 - -1 - - - 70 - 302 - - - true - - true - 39872d87:13e14015f61:-3dd3 - - 115 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 182 - 0 - - false - 1 - - - - - 64 - - 145 - - - true - - true - 39872d87:13e14015f61:-3dce - - 95 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 100 - 0 - - false - 1 - - - - - 20 - - 82 - - false - true - true - 39872d87:13e14015f61:-3dcd - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R1).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 0 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3dcc - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R2).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 25 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3dcb - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R3).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 50 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3dca - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R4).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 75 - - $(pv_name) -$(pv_value) - 0 - - - - true - true - 1 - false - 39872d87:13e14015f61:-3dd2 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R1) - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 23 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dd1 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R2) - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 48 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dd0 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R3) - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 73 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dcf - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R4) - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 98 - false - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3dc9 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - VAL - - - - 27 - 0 - - 1 - - - - 1 - - 0 - true - - 24 - - - - - true - - true - 39872d87:13e14015f61:-3dc4 - - 20 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 145 - 0 - - false - 1 - - - - - 185 - - 94 - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 50 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3dc3 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(PORT)PollDelay - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3dc2 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Poll delay - - - - 90 - 0 - - 1 - - - - 1 - - 3 - true - - 55 - - - - - true - - true - 39872d87:13e14015f61:-3dc1 - - 20 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 94 - 0 - - false - 1 - - - - - 210 - - 91 - - false - true - false - 39872d87:13e14015f61:-3dc0 - - 20 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 53 - 6 - - - - 1 - - - - 0 - - - asynRecord.opi - - true - $(PORT)Asyn - - 0 - asynRecord - - - modbusStatistics.opi - - true - $(PORT) - - 0 - I/O Statistics - - - modbusArray.opi - - true - $(PORT)Array - - 0 - Array - - - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3dbf - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - More - - - - 36 - 0 - - 1 - - - - 1 - - 3 - true - - 58 - - - - - true - - true - 39872d87:13e14015f61:-3dbe - - 15 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 134 - 0 - - false - 1 - - - - - 235 - - 69 - - true - true - 1 - false - 39872d87:13e14015f61:-3dbd - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 3 - true - false - $(P)$(R1).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 1 - - 0 - false - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3dbc - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Status - - - - 54 - 0 - - 1 - - - - 1 - - 0 - true - - 80 - - - - true - 1 - 39872d87:13e14015f61:-3dda - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(P)$(R1)-$(R4) Inputs - - - - 220 - 0 - - 1 - - - - 1 - - 12 - true - - 55 - - - true - 1 - 39872d87:13e14015f61:-3dd9 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R1) - - - - 45 - 0 - - 1 - - - - 1 - - 87 - true - - 10 - - - true - 1 - 39872d87:13e14015f61:-3dd8 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R2) - - - - 45 - 0 - - 1 - - - - 1 - - 112 - true - - 10 - - - true - 1 - 39872d87:13e14015f61:-3dd7 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R3) - - - - 45 - 0 - - 1 - - - - 1 - - 137 - true - - 10 - - - true - 1 - 39872d87:13e14015f61:-3dd6 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R4) - - - - 45 - 0 - - 1 - - - - 1 - - 162 - true - - 10 - - - true - 1 - 39872d87:13e14015f61:-3dd5 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - (ai records) - - - - 108 - 0 - - 1 - - - - 1 - - 40 - true - - 111 - - - true - 1 - 39872d87:13e14015f61:-3dd4 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - RVAL - - - - 27 - 0 - - 1 - - - - 1 - - 64 - true - - 85 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dc8 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 3 - true - false - $(P)$(R1).RVAL - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 87 - false - $(pv_name) -$(pv_value) - 61 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dc7 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 3 - true - false - $(P)$(R2).RVAL - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 112 - false - $(pv_name) -$(pv_value) - 61 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dc6 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 3 - true - false - $(P)$(R3).RVAL - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 137 - false - $(pv_name) -$(pv_value) - 61 - - - true - true - 1 - false - 39872d87:13e14015f61:-3dc5 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 3 - true - false - $(P)$(R4).RVAL - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 162 - false - $(pv_name) -$(pv_value) - 61 - - \ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 260 + + true + + Koyo_4ADC + + + true + true + false + true + false + Display + 330 + 302 + 70 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 115 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 182 + 145 + 64 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 95 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 100 + 82 + 20 + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R1).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 0 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R2).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 25 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R3).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 50 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R4).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 75 + + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R1) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 23 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R2) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 48 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R3) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 73 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R4) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 98 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + VAL + + true + 1 + true + Label + 27 + false + 24 + 0 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 20 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 145 + 94 + 185 + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(PORT)PollDelay + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 50 + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + Poll delay + + true + 1 + true + Label + 90 + false + 55 + 3 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 20 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 94 + 91 + 210 + + + + asynRecord.opi + + true + $(PORT)Asyn + + 1 + asynRecord + + + modbusStatistics.opi + + true + $(PORT) + + 1 + I/O Statistics + + + modbusArray.opi + + true + $(PORT)Array + + 1 + Array + + + false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 53 + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + More + + true + 1 + true + Label + 36 + false + 58 + 3 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 15 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 134 + 69 + 235 + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 3 + 15 + 1 + Text Update + 0 + true + $(P)$(R1).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 54 + false + 80 + 0 + + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + $(P)$(R1)-$(R4) Inputs + + true + 1 + true + Label + 220 + false + 55 + 12 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R1) + + true + 1 + true + Label + 45 + false + 10 + 87 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R2) + + true + 1 + true + Label + 45 + false + 10 + 112 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R3) + + true + 1 + true + Label + 45 + false + 10 + 137 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R4) + + true + 1 + true + Label + 45 + false + 10 + 162 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + (ai records) + + true + 1 + true + Label + 108 + false + 111 + 40 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + RVAL + + true + 1 + true + Label + 27 + false + 85 + 64 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 3 + 15 + 2 + Text Update + 0 + true + $(P)$(R1).RVAL + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 61 + 87 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 3 + 15 + 2 + Text Update + 0 + true + $(P)$(R2).RVAL + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 61 + 112 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 3 + 15 + 2 + Text Update + 0 + true + $(P)$(R3).RVAL + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 61 + 137 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 3 + 15 + 2 + Text Update + 0 + true + $(P)$(R4).RVAL + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 61 + 162 + + diff --git a/modbusApp/op/opi/Koyo_8inputs.opi b/modbusApp/op/opi/autoconvert/Koyo_8inputs.opi similarity index 81% rename from modbusApp/op/opi/Koyo_8inputs.opi rename to modbusApp/op/opi/autoconvert/Koyo_8inputs.opi index c12b9d9..8e59d28 100644 --- a/modbusApp/op/opi/Koyo_8inputs.opi +++ b/modbusApp/op/opi/autoconvert/Koyo_8inputs.opi @@ -1,3637 +1,3636 @@ - - false - - true - - 39872d87:13e14015f61:-3d9a - 3.1.2.20120830 - - true - 415 - Koyo_8inputs - false - false - - - - - - - Display - true - 400 - - true - 5 - - false - -1 - -1 - - - 33 - 453 - - - true - - true - 39872d87:13e14015f61:-3d8e - - 190 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 50 - 0 - - false - 1 - - - - - 87 - - 5 - - true - 1 - 39872d87:13e14015f61:-3d8d - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)0 - - - - 50 - 0 - - 1 - - - - 1 - - 0 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d8c - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)1 - - - - 50 - 0 - - 1 - - - - 1 - - 25 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d8b - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)2 - - - - 50 - 0 - - 1 - - - - 1 - - 50 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d8a - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)3 - - - - 50 - 0 - - 1 - - - - 1 - - 75 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d89 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)4 - - - - 50 - 0 - - 1 - - - - 1 - - 100 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d88 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)5 - - - - 50 - 0 - - 1 - - - - 1 - - 125 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d87 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)6 - - - - 50 - 0 - - 1 - - - - 1 - - 150 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3d86 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)7 - - - - 50 - 0 - - 1 - - - - 1 - - 175 - true - - 0 - - - - - true - - true - 39872d87:13e14015f61:-3d85 - - 35 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 108 - 0 - - false - 1 - - - - - 35 - - 119 - - true - 1 - 39872d87:13e14015f61:-3d84 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(AC) access - - - - 90 - 0 - - 1 - - - - 1 - - 0 - true - - 9 - - - true - 1 - 39872d87:13e14015f61:-3d83 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - (bi records) - - - - 108 - 0 - - 1 - - - - 1 - - 20 - true - - 0 - - - - - true - - true - 39872d87:13e14015f61:-3d82 - - 15 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 235 - 0 - - false - 1 - - - - - 335 - - 8 - - true - true - 1 - false - 39872d87:13e14015f61:-3d81 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B0 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 225 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d80 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B1 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 210 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d7f - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B2 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 195 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d7e - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B3 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 180 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d7d - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B4 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 165 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d7c - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B5 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 150 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d7b - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B6 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 135 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d7a - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B7 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 120 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d79 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B8 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 105 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d78 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).B9 - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 90 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d77 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).BA - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 75 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d76 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).BB - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 60 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d75 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).BC - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 45 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d74 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).BD - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 30 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d73 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).BE - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 15 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d72 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(L).BF - - - - - - - Text Update - true - ###### - false - 0 - - - - 10 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 0 - - - - - true - - true - 39872d87:13e14015f61:-3d71 - - 245 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 100 - 0 - - false - 1 - - - - - 84 - - 127 - - false - true - true - 39872d87:13e14015f61:-3d70 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)0$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 0 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d6f - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)1$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 25 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d6e - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)2$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 50 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d6d - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)3$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 75 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d6c - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)4$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 100 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d6b - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)5$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 125 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d6a - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)6$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 150 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d69 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)7$(A).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 175 - - $(pv_name) -$(pv_value) - 0 - - - false - true - true - 39872d87:13e14015f61:-3d68 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(L).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 225 - - $(pv_name) -$(pv_value) - 0 - - - - - true - - true - 39872d87:13e14015f61:-3d67 - - 267 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 160 - 0 - - false - 1 - - - - - 60 - - 232 - - true - true - 1 - false - 39872d87:13e14015f61:-3d66 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(L).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 252 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d65 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)0$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 27 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d64 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)1$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 52 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d63 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)2$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 77 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d62 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)3$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 102 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d61 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)4$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 127 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d60 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)5$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 152 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d5f - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)6$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 177 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d5e - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)7$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 202 - false - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3d5d - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Status - - - - 70 - 0 - - 1 - - - - 1 - - 0 - true - - 2 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d5c - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)0$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 27 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d5b - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)1$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 52 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d5a - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)2$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 77 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d59 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)3$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 102 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d58 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)4$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 127 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d57 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)5$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 152 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d56 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)6$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 177 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d55 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)7$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 202 - false - $(pv_name) -$(pv_value) - 83 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d54 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(L).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 252 - false - $(pv_name) -$(pv_value) - 83 - - - true - 1 - 39872d87:13e14015f61:-3d53 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Severity - - - - 80 - 0 - - 1 - - - - 1 - - 0 - true - - 80 - - - - - true - - true - 39872d87:13e14015f61:-3d52 - - 45 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 148 - 0 - - false - 1 - - - - - 365 - - 126 - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 50 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3d51 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(PORT)PollDelay - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 1 - - - true - 1 - 39872d87:13e14015f61:-3d50 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Poll delay - - - - 90 - 0 - - 1 - - - - 1 - - 2 - true - - 58 - - - false - true - false - 39872d87:13e14015f61:-3d4f - - 20 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 53 - 6 - - - - 1 - - - - 25 - - - asynRecord.opi - - true - $(PORT)Asyn - - 0 - asynRecord - - - modbusStatistics.opi - - true - $(PORT) - - 0 - I/O Statistics - - - modbusArray.opi - - true - $(PORT)Array - - 0 - Array - - - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3d4e - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - More - - - - 36 - 0 - - 1 - - - - 1 - - 27 - true - - 58 - - - - true - 1 - 39872d87:13e14015f61:-3d99 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)0-$(R)7 Inputs - - - - 180 - 0 - - 1 - - - - 1 - - 5 - true - - 110 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d98 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)0$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 87 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d97 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)1$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 112 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d96 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)2$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 137 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d95 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)3$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 162 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d94 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)4$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 187 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d93 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)5$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 212 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d92 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)6$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 237 - false - $(pv_name) -$(pv_value) - 70 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d91 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)7$(A) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 262 - false - $(pv_name) -$(pv_value) - 70 - - - true - 1 - 39872d87:13e14015f61:-3d90 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - (mbbiDirect record) - - - - 171 - 0 - - 1 - - - - 1 - - 287 - true - - 40 - - - true - true - 1 - false - 39872d87:13e14015f61:-3d8f - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 3 - true - false - $(P)$(L) - - - - - - - Text Update - true - ###### - false - 0 - - - - 50 - 0 - - - 1 - - - - 1 - - 312 - false - $(pv_name) -$(pv_value) - 70 - - \ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 415 + + true + + Koyo_8inputs + + + true + true + false + true + false + Display + 400 + 453 + 33 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 190 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 50 + 5 + 87 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)0 + + true + 1 + true + Label + 50 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)1 + + true + 1 + true + Label + 50 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)2 + + true + 1 + true + Label + 50 + false + 0 + 50 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)3 + + true + 1 + true + Label + 50 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)4 + + true + 1 + true + Label + 50 + false + 0 + 100 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)5 + + true + 1 + true + Label + 50 + false + 0 + 125 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)6 + + true + 1 + true + Label + 50 + false + 0 + 150 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)7 + + true + 1 + true + Label + 50 + false + 0 + 175 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 35 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 108 + 119 + 35 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + $(AC) access + + true + 1 + true + Label + 90 + false + 9 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + (bi records) + + true + 1 + true + Label + 108 + false + 0 + 20 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 15 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 235 + 8 + 335 + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B0 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 225 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B1 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 210 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B2 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 195 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B3 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 180 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B4 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 165 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B5 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 150 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B6 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 135 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B7 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 120 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B8 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 105 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).B9 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 90 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).BA + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 75 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).BB + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 60 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).BC + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 45 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).BD + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 30 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 15 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(L).BF + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 10 + false + 0 + 0 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 245 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 100 + 127 + 84 + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)0$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 0 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)1$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 25 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)2$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 50 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)3$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 75 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)4$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 100 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)5$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 125 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)6$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 150 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)7$(A).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 175 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(L).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 0 + 225 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 267 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 160 + 232 + 60 + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(L).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 252 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)0$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 27 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)1$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 52 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)2$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 77 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)3$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 102 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)4$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 127 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)5$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 152 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)6$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 177 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)7$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 0 + 202 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 70 + false + 2 + 0 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)0$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 27 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)1$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 52 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)2$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 77 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)3$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 102 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)4$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 127 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)5$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 152 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)6$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 177 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)7$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 202 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(L).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 83 + 252 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Severity + + true + 1 + true + Label + 80 + false + 80 + 0 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 45 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 148 + 126 + 365 + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(PORT)PollDelay + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 50 + 1 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + Poll delay + + true + 1 + true + Label + 90 + false + 58 + 2 + + + + + asynRecord.opi + + true + $(PORT)Asyn + + 1 + asynRecord + + + modbusStatistics.opi + + true + $(PORT) + + 1 + I/O Statistics + + + modbusArray.opi + + true + $(PORT)Array + + 1 + Array + + + false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 53 + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + More + + true + 1 + true + Label + 36 + false + 58 + 27 + + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + $(R)0-$(R)7 Inputs + + true + 1 + true + Label + 180 + false + 110 + 5 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)0$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 87 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)1$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 112 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)2$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 137 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)3$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 162 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)4$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 187 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)5$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 212 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)6$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 237 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 1 + Text Update + 0 + true + $(P)$(R)7$(A) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 262 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + (mbbiDirect record) + + true + 1 + true + Label + 171 + false + 40 + 287 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 3 + 15 + 1 + Text Update + 0 + true + $(P)$(L) + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 50 + false + 70 + 312 + + diff --git a/modbusApp/op/opi/Koyo_8outputs.opi b/modbusApp/op/opi/autoconvert/Koyo_8outputs.opi similarity index 80% rename from modbusApp/op/opi/Koyo_8outputs.opi rename to modbusApp/op/opi/autoconvert/Koyo_8outputs.opi index 643edae..7f639f4 100644 --- a/modbusApp/op/opi/Koyo_8outputs.opi +++ b/modbusApp/op/opi/autoconvert/Koyo_8outputs.opi @@ -1,3183 +1,3268 @@ - - false - - true - - 39872d87:13e14015f61:-3cff - 3.1.2.20120830 - - true - 450 - Koyo_8outputs - false - false - - - - - - - Display - true - 360 - - true - 5 - - false - -1 - -1 - - - 141 - 376 - - - true - - true - 39872d87:13e14015f61:-3cf4 - - 190 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 50 - 0 - - false - 1 - - - - - 87 - - 5 - - true - 1 - 39872d87:13e14015f61:-3cf3 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)0 - - - - 50 - 0 - - 1 - - - - 1 - - 0 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3cf2 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)1 - - - - 50 - 0 - - 1 - - - - 1 - - 25 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3cf1 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)2 - - - - 50 - 0 - - 1 - - - - 1 - - 50 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3cf0 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)3 - - - - 50 - 0 - - 1 - - - - 1 - - 75 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3cef - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)4 - - - - 50 - 0 - - 1 - - - - 1 - - 100 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3cee - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)5 - - - - 50 - 0 - - 1 - - - - 1 - - 125 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3ced - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)6 - - - - 50 - 0 - - 1 - - - - 1 - - 150 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3cec - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)7 - - - - 50 - 0 - - 1 - - - - 1 - - 175 - true - - 0 - - - - - true - - true - 39872d87:13e14015f61:-3ce8 - - 43 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 169 - 0 - - false - 1 - - - - - 339 - - 16 - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce7 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B0 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 105 - - - true - 1 - 39872d87:13e14015f61:-3ce6 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - B0-B7 - - - - 45 - 0 - - 1 - - - - 0 - - 4 - true - - 124 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce5 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B1 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 90 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce4 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B2 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 75 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce3 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B3 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 60 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce2 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B4 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 45 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce1 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B5 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 30 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce0 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B6 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 15 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cdf - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B7 - - - - false - 0 - - - false - - - - 0 - - 0 - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3cde - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - B8-BF - - - - 45 - 0 - - 1 - - - - 0 - - 24 - true - - 123 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cdd - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B8 - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 105 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cdc - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).B9 - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 90 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cdb - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).BA - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 75 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cda - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).BB - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 60 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cd9 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).BC - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 45 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cd8 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).BD - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 30 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cd7 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).BE - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 15 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 15 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3cd6 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(L).BF - - - - false - 0 - - - false - - - - 0 - - 23 - $(pv_name) -$(pv_value) - 0 - - - - - true - - true - 39872d87:13e14015f61:-3cc1 - - 20 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 94 - 0 - - false - 1 - - - - - 413 - - 133 - - false - true - false - 39872d87:13e14015f61:-3cc0 - - 20 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 53 - 6 - - - - 1 - - - - 0 - - - asynRecord.opi - - true - $(PORT)Asyn - - 0 - asynRecord - - - modbusStatistics.opi - - true - $(PORT) - - 0 - I/O Statistics - - - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3cbf - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - More - - - - 36 - 0 - - 1 - - - - 1 - - 3 - true - - 58 - - - - false - true - 39872d87:13e14015f61:-3cfe - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)0$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 85 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cfd - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)1$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 110 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cfc - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)2$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 135 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cfb - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)3$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 160 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cfa - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)4$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 185 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cf9 - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)5$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 210 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cf8 - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)6$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 235 - $(pv_name) -$(pv_value) - 70 - - - false - true - 39872d87:13e14015f61:-3cf7 - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)7$(A) - - - - - - - Choice Button - true - false - - Default - - 100 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 260 - $(pv_name) -$(pv_value) - 70 - - - true - 1 - 39872d87:13e14015f61:-3cf6 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - (mbboDirect record) - - - - 171 - 0 - - 1 - - - - 1 - - 291 - true - - 15 - - - true - 1 - 39872d87:13e14015f61:-3cf5 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(R)0-$(R)7 Outputs - - - - 180 - 0 - - 1 - - - - 1 - - 5 - true - - 90 - - - true - 1 - 39872d87:13e14015f61:-3ceb - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(AC) access - - - - 108 - 0 - - 1 - - - - 1 - - 38 - true - - 64 - - - true - 1 - 39872d87:13e14015f61:-3cea - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - (bo records) - - - - 108 - 0 - - 1 - - - - 1 - - 58 - true - - 64 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3ce9 - 0.0 - Text Input - - true - true - false - - 3 - false - 0 - $(P)$(L) - - - - false - 0 - - - false - - - - 0 - - 312 - $(pv_name) -$(pv_value) - 60 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cd5 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(L).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 315 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cd4 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)0$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 87 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cd3 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)1$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 112 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cd2 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)2$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 137 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cd1 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)3$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 162 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cd0 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)4$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 187 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3ccf - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)5$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 212 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cce - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)6$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 237 - false - $(pv_name) -$(pv_value) - 189 - - - true - true - 1 - false - 39872d87:13e14015f61:-3ccd - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)7$(A).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 262 - false - $(pv_name) -$(pv_value) - 189 - - - true - 1 - 39872d87:13e14015f61:-3ccc - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Status - - - - 70 - 0 - - 1 - - - - 1 - - 60 - true - - 191 - - - true - true - 1 - false - 39872d87:13e14015f61:-3ccb - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)0$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 87 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cca - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)1$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 112 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc9 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)2$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 137 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc8 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)3$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 162 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc7 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)4$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 187 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc6 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)5$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 212 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc5 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)6$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 237 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc4 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R)7$(A).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 262 - false - $(pv_name) -$(pv_value) - 272 - - - true - true - 1 - false - 39872d87:13e14015f61:-3cc3 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(L).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 315 - false - $(pv_name) -$(pv_value) - 272 - - - true - 1 - 39872d87:13e14015f61:-3cc2 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Severity - - - - 80 - 0 - - 1 - - - - 1 - - 60 - true - - 269 - - \ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 450 + + true + + Koyo_8outputs + + + true + true + false + true + false + Display + 360 + 376 + 141 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 190 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 50 + 5 + 87 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)0 + + true + 1 + true + Label + 50 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)1 + + true + 1 + true + Label + 50 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)2 + + true + 1 + true + Label + 50 + false + 0 + 50 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)3 + + true + 1 + true + Label + 50 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)4 + + true + 1 + true + Label + 50 + false + 0 + 100 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)5 + + true + 1 + true + Label + 50 + false + 0 + 125 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)6 + + true + 1 + true + Label + 50 + false + 0 + 150 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + $(R)7 + + true + 1 + true + Label + 50 + false + 0 + 175 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 43 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 169 + 16 + 339 + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B0 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 105 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + B0-B7 + + true + 1 + true + Label + 45 + false + 124 + 4 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B1 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 90 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B2 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 75 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B3 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 60 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B4 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 45 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B5 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 30 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B6 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 15 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B7 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + B8-BF + + true + 1 + true + Label + 45 + false + 123 + 24 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B8 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 105 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).B9 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 90 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).BA + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 75 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).BB + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 60 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).BC + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 45 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).BD + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 30 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 15 + 23 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L).BF + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 15 + 0 + 23 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 20 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 94 + 133 + 413 + + + + asynRecord.opi + + true + $(PORT)Asyn + + 1 + asynRecord + + + modbusStatistics.opi + + true + $(PORT) + + 1 + I/O Statistics + + + false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 53 + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + More + + true + 1 + true + Label + 36 + false + 58 + 3 + + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)0$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 85 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)1$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 110 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)2$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 135 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)3$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 160 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)4$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 185 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)5$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 210 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)6$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 235 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)7$(A) + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 100 + 70 + 260 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + (mbboDirect record) + + true + 1 + true + Label + 171 + false + 15 + 291 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + $(R)0-$(R)7 Outputs + + true + 1 + true + Label + 180 + false + 90 + 5 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + $(AC) access + + true + 1 + true + Label + 108 + false + 64 + 38 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + (bo records) + + true + 1 + true + Label + 108 + false + 64 + 58 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 3 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(L) + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 60 + 312 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(L).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 315 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)0$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 87 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)1$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 112 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)2$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 137 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)3$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 162 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)4$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 187 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)5$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 212 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)6$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 237 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)7$(A).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 189 + 262 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 70 + false + 191 + 60 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)0$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 87 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)1$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 112 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)2$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 137 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)3$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 162 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)4$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 187 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)5$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 212 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)6$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 237 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)7$(A).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 262 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(L).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 272 + 315 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Severity + + true + 1 + true + Label + 80 + false + 269 + 60 + + diff --git a/modbusApp/op/opi/autoconvert/array_test.opi b/modbusApp/op/opi/autoconvert/array_test.opi new file mode 100644 index 0000000..7455a19 --- /dev/null +++ b/modbusApp/op/opi/autoconvert/array_test.opi @@ -0,0 +1,198 @@ + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 100 + + true + + array_test + + + true + true + false + true + false + Display + 250 + 446 + 76 + + + false + + + + + + + 0 + 1 + true + + + + + + + 25 + 1 + Label + + + true + true + false + + + false + Array Test + + true + 1 + true + Label + 120 + false + 65 + 7 + + + + + modbusArrayTest.opi + + true +

SIM1:

+ UINT16: +
+ 1 + UINT16 +
+ + modbusArrayTest.opi + + true +

SIM1:

+ INT16: +
+ 1 + INT16 +
+ + modbusArrayTest.opi + + true +

SIM1:

+ INT32_LE: +
+ 1 + INT32_LE +
+ + modbusArrayTest.opi + + true +

SIM1:

+ INT32_BE: +
+ 1 + INT32_BE +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 120 + 98 + 58 +
+ + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Arrays + + true + 1 + true + Label + 60 + false + 33 + 58 + +
diff --git a/modbusApp/op/opi/modbusArray.opi b/modbusApp/op/opi/autoconvert/modbusArray.opi similarity index 89% rename from modbusApp/op/opi/modbusArray.opi rename to modbusApp/op/opi/autoconvert/modbusArray.opi index c194081..18de491 100644 --- a/modbusApp/op/opi/modbusArray.opi +++ b/modbusApp/op/opi/autoconvert/modbusArray.opi @@ -1,910 +1,907 @@ - - false - - true - - 39872d87:13e14015f61:-3c7c - 3.1.2.20120830 - - true - 315 - modbusArray - false - false - - - - - - - Display - true - 560 - - true - 5 - - false - -1 - -1 - - - 175 - 730 - - - true - - true - 39872d87:13e14015f61:-3c76 - - 20 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 167 - 0 - - false - 1 - - - - - 287 - - 20 - - false - true - true - 39872d87:13e14015f61:-3c75 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R).SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 0 - - $(pv_name) -$(pv_value) - 67 - - - true - 1 - 39872d87:13e14015f61:-3c74 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Update: - - - - 63 - 0 - - 1 - - - - 0 - - 3 - true - - 0 - - - - true - true - - 100 - 0 - 0 - 100 - 1 - 0 - true - - - - - 0 - 100 - 0 - true - 0 - 0.0 - - true - - 100 - 100 - 0 - 100 - 0 - 4 - 1 - 0 - 0 - 0 - 100 - 1 - true - - true - - true - false - true - - 1 - false - 0 - 4 - $(trace_19_y_pv) - true - true - 0 - 1 - 0 - 0 - 1 - 0 - $(trace_1_y_pv) - $(trace_17_y_pv) - true - - - - 0 - 0.0 - 1 - 4 - - true - 0 - 0 - true - 0 - 1 - - - - 5 - 0 - 5 - - - - true - - - true - - - 275 - 100.0 - $(trace_10_y_pv) - - - - - $(trace_9_y_pv) - 100 - 0 - 0 - true - 1 - - - - - - 100 - - - - 1 - true - 0 - true - $(trace_3_y_pv) - 0 - - - - - 0 - 0 - - 100 - XY Graph - 0 - 0.0 - true - 100 - - 1 - true - 1 - 0 - 0 - 0 - - true - true - - 100 - 100 - 0 - true - 0 - $(trace_15_y_pv) - - - - 0 - 100 - true - 1 - - 1 - 0 - 1 - 0.0 - 0 - 0 - $(trace_0_y_pv) - true - 0.0 - - 1 - 4 - 100.0 - 0 - true - true - 1 - - - 100 - Array index - 1 - - - - $(trace_14_y_pv) - 39872d87:13e14015f61:-3c7b - 100 - - - - - - - 4 - 0 - - - - 0 - 0 - false - Value - true - - 1 - - 0 - true - 0 - 100.0 - 100 - true - 4 - 100 - 0 - $(trace_16_y_pv) - - Default - - 1 - 0 - true - $(trace_12_y_pv) - 4 - 0 - 0 - 1 - 0 - 0 - 0 - - 0 - $(trace_8_y_pv) - 0 - - - 0 - - true - true - - - - - - 0 - true - - true - $(trace_5_y_pv) - true - 100 - 1 - 0 - 0 - false - - 1 - 0 - - - 0 - - 1 - 0.0 - - 100 - - $(trace_13_y_pv) - - true - 0 - 100.0 - 0 - - - - - - - - - 100 - true - 100 - 0 - true - true - true - true - 0 - 0 - true - 0 - 0 - - - 4 - - - - false - 0 - 0 - - - 1 - true - - $(trace_4_y_pv) - 1 - true - true - 100 - 0 - 0 - - 100 - 0 - true - 1 - $(P)$(R) - $(trace_18_y_pv) - - true - - 4 - - 4 - - 0 - - - - 100 - - 0 - true - 0 - 100 - 1 - 4 - true - 100 - 1 - 0 - 0 - - - - true - - true - false - - - - Secondary Axis (2) - - true - 0 - XY Graph - true - 550 - 100 - 0 - - - - 1 - 0 - 100 - 100 - - 0 - - - - 0 - 1 - 100 - - - - 2 - $(trace_2_y_pv) - true - 4 - true - false - true - 0 - true - true - - 100 - - 0 - 0 - true - 100 - - - - 0 - 1 - 4 - - 0 - $(trace_0_y_pv) -$(trace_0_y_pv_value) - $(trace_11_y_pv) - true - - - - - 4 - 0 - 100 - $(trace_6_y_pv) - 4 - 0 - 1 - true - 0 - 1 - true - - Default - - 0 - 0 - 1 - 0 - - - - true - 0 - - Default - - 4 - - 0 - true - 0 - Array data for $(P)$(R) - Secondary Axis (3) - false - true - 0 - 100 - - - true - 0 - - 0.0 - - - - 0 - 4 - - true - 1 - - Default - - true - - - 0.0 - - - - - - - - - - - 100 - 4 - true - 100 - true - 1 - true - - true - true - - 0 - - - - 0 - 1 - - - - - - - true - 100 - - - - - - - - 4 - - - - true - 0 - - - - - - - 1 - - 0 - true - - 0 - 1 - - 0 - true - 1 - true - true - - - true - true - false - - - true - - 100 - 1 - 0 - - - - 0 - - - - - true - 100 - - - - true - 4 - true - $(trace_7_y_pv) - - - true - 1 - 39872d87:13e14015f61:-3c7a - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Severity - - - - 80 - 0 - - 1 - - - - 1 - - 287 - true - - 375 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c79 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R).SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 290 - false - $(pv_name) -$(pv_value) - 460 - - - true - 1 - 39872d87:13e14015f61:-3c78 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Status - - - - 60 - 0 - - 1 - - - - 1 - - 287 - true - - 214 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c77 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(R).STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 290 - false - $(pv_name) -$(pv_value) - 279 - - \ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 315 + + true + + modbusArray + + + true + true + false + true + false + Display + 560 + 730 + 175 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 20 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 167 + 20 + 287 + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R).SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 67 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Update: + + true + 1 + true + Label + 63 + false + 0 + 3 + + + + + false + true + 0.0 + + + + Array index + true + + + + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 0.0 + + + + Value + true + + + + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 0.0 + + + + Secondary Axis (2) + true + + + + true + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + true + 0.0 + + + + Secondary Axis (3) + true + + + + true + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 2 + false + + + + true + + + + 0 + 1 + true + false + + + + 275 + XY Graph + + + + + + + + true + true + false + + + true + false + true + Array data for $(P)$(R) + + Default Bold + + $(trace_0_y_pv) +$(trace_0_y_pv_value) + true + 0 + false + 1 + $(trace_0_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + $(P)$(R) + + true + 100 + true + 1 + $(trace_10_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_11_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_12_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_13_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_14_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_15_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_16_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_17_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_18_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_19_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_1_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_2_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_3_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_4_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_5_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_6_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_7_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_8_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_9_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + 1 + false + + + true + XY Graph + 550 + 5 + 5 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Severity + + true + 1 + true + Label + 80 + false + 375 + 287 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R).SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 460 + 290 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 60 + false + 214 + 287 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R).STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 279 + 290 + + diff --git a/modbusApp/op/opi/modbusStatistics.opi b/modbusApp/op/opi/autoconvert/modbusArrayTest.opi similarity index 69% rename from modbusApp/op/opi/modbusStatistics.opi rename to modbusApp/op/opi/autoconvert/modbusArrayTest.opi index b9985fa..efef844 100644 --- a/modbusApp/op/opi/modbusStatistics.opi +++ b/modbusApp/op/opi/autoconvert/modbusArrayTest.opi @@ -1,1317 +1,1134 @@ - - false - - true - - 39872d87:13e14015f61:-3b91 - 3.1.2.20120830 - - true - 355 - modbusStatistics - false - false - - - - - - - Display - true - 560 - - true - 5 - - false - -1 - -1 - - - 50 - 730 - - - true - - true - 39872d87:13e14015f61:-3b8b - - 15 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 145 - 0 - - false - 1 - - - - - 312 - - 10 - - true - true - 1 - false - 39872d87:13e14015f61:-3b8a - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R)ReadOK - - - - - - - Text Update - true - ###### - false - 0 - - - - 70 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 75 - - - true - 1 - 39872d87:13e14015f61:-3b89 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Read OK: - - - - 72 - 0 - - 1 - - - - 0 - - 0 - true - - 0 - - - - - true - - true - 39872d87:13e14015f61:-3b84 - - 15 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 265 - 0 - - false - 1 - - - - - 333 - - 10 - - true - 1 - 39872d87:13e14015f61:-3b83 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Last I/O Time (msec): - - - - 189 - 0 - - 1 - - - - 0 - - 0 - true - - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3b82 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R)LastIOTime - - - - - - - Text Update - true - ###### - false - 0 - - - - 70 - 0 - - - 1 - - - - 0 - - 0 - false - $(pv_name) -$(pv_value) - 195 - - - - true - true - - 100 - 0 - 0 - 100 - 1 - 0 - true - - - - - 0 - 100 - 0 - true - 0 - 0.0 - - true - - 100 - 100 - 0 - 100 - 0 - 4 - 1 - 0 - 0 - 0 - 100 - 1 - true - - true - - true - false - true - - 1 - false - 0 - 4 - $(trace_19_y_pv) - true - true - 0 - 1 - 0 - 0 - 1 - 0 - $(trace_1_y_pv) - $(trace_17_y_pv) - true - - - - 0 - 0.0 - 1 - 4 - - true - 0 - 0 - true - 0 - 1 - - - - 5 - 0 - 5 - - - - true - - - true - - - 275 - 100.0 - $(trace_10_y_pv) - - - - - $(trace_9_y_pv) - 100 - 0 - 0 - true - 1 - - - - - - 100 - - - - 1 - true - 0 - true - $(trace_3_y_pv) - 0 - - - - - 0 - 0 - - 100 - XY Graph - 0 - 0.0 - true - 100 - - 1 - true - 1 - 0 - 0 - 0 - - true - true - - 100 - 100 - 0 - true - 0 - $(trace_15_y_pv) - - - - 0 - 100 - true - 1 - - 1 - 0 - 1 - 0.0 - 0 - 0 - $(trace_0_y_pv) - true - 0.0 - - 1 - 4 - 100.0 - 0 - true - true - 1 - - - 100 - Write/read cycle time (msec) - 1 - - - - $(trace_14_y_pv) - 39872d87:13e14015f61:-3b90 - 100 - - - - - - - 4 - 0 - - - - 0 - 0 - false - Number of events - true - - 1 - - 0 - true - 0 - 100.0 - 100 - true - 4 - 100 - 0 - $(trace_16_y_pv) - - Default - - 1 - 0 - true - $(trace_12_y_pv) - 4 - 0 - 0 - 1 - 0 - 0 - 0 - - 0 - $(trace_8_y_pv) - 0 - - - 0 - - true - true - - - - - - 0 - true - - true - $(trace_5_y_pv) - true - 100 - 1 - 0 - 0 - false - - 1 - 0 - - - 0 - - 1 - 0.0 - - 100 - - $(trace_13_y_pv) - - true - 0 - 100.0 - 0 - - - - - - - - - 100 - true - 100 - 0 - true - true - true - true - 0 - 0 - true - 0 - 0 - - - 4 - - - - false - 0 - 0 - - - 1 - true - - $(trace_4_y_pv) - 1 - true - true - 100 - 0 - 0 - - 100 - 0 - true - 1 - $(P)$(R)Hist - $(trace_18_y_pv) - - true - - 4 - - 4 - - 0 - - - - 100 - - 0 - true - 0 - 100 - 1 - 4 - true - 100 - 1 - 0 - 0 - - - - true - - true - false - - - - Secondary Axis (2) - - true - 0 - XY Graph - true - 550 - 100 - 0 - - - - 1 - 0 - 100 - 100 - - 0 - - - - 0 - 1 - 100 - - - - 2 - $(trace_2_y_pv) - true - 4 - true - false - true - 0 - true - true - - 100 - - 0 - 0 - true - 100 - - - - 0 - 1 - 4 - - 0 - $(trace_0_y_pv) -$(trace_0_y_pv_value) - $(trace_11_y_pv) - true - - - - - 4 - 0 - 100 - $(trace_6_y_pv) - 4 - 0 - 1 - true - 0 - 1 - true - - Default - - 0 - 0 - 1 - 0 - - - - true - 0 - - Default - - 4 - - 0 - true - 0 - Histogram of cycle times $(P)$(R) - Secondary Axis (3) - false - true - 0 - 100 - - - true - 0 - - 0.0 - - - - 0 - 4 - - true - 1 - - Default - - true - - - 0.0 - - - - - - - - - - - 100 - 4 - true - 100 - true - 1 - true - - true - true - - 0 - - - - 0 - 1 - - - - - - - true - 100 - - - - - - - - 4 - - - - true - 0 - - - - - - - 1 - - 0 - true - - 0 - 1 - - 0 - true - 1 - true - true - - - true - true - false - - - true - - 100 - 1 - 0 - - - - 0 - - - - - true - 100 - - - - true - 4 - true - $(trace_7_y_pv) - - - false - true - 39872d87:13e14015f61:-3b8f - - 20 - Choice Button - false - - true - true - false - - $(P)$(R)HistEnable - - - - - - - Choice Button - true - false - - Default - - 150 - 0 - - - - - - - Choice 1 - Choice 2 - Choice 3 - - 1 - true - - - - true - - 286 - $(pv_name) -$(pv_value) - 202 - - - true - 1 - 39872d87:13e14015f61:-3b8e - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Enable histogramming: - - - - 189 - 0 - - 1 - - - - 0 - - 289 - true - - 10 - - - false - true - true - 39872d87:13e14015f61:-3b8d - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(R)Statistics.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 286 - - $(pv_name) -$(pv_value) - 437 - - - true - 1 - 39872d87:13e14015f61:-3b8c - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Update: - - - - 63 - 0 - - 1 - - - - 0 - - 289 - true - - 370 - - - true - true - 1 - false - 39872d87:13e14015f61:-3b88 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R)WriteOK - - - - - - - Text Update - true - ###### - false - 0 - - - - 70 - 0 - - - 1 - - - - 0 - - 312 - false - $(pv_name) -$(pv_value) - 251 - - - true - 1 - 39872d87:13e14015f61:-3b87 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Write OK: - - - - 81 - 0 - - 1 - - - - 0 - - 312 - true - - 165 - - - true - true - 1 - false - 39872d87:13e14015f61:-3b86 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R)IOErrors - - - - - - - Text Update - true - ###### - false - 0 - - - - 70 - 0 - - - 1 - - - - 0 - - 312 - false - $(pv_name) -$(pv_value) - 445 - - - true - 1 - 39872d87:13e14015f61:-3b85 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - I/O Errors: - - - - 99 - 0 - - 1 - - - - 0 - - 312 - true - - 342 - - - true - 1 - 39872d87:13e14015f61:-3b81 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Max. I/O Time (msec): - - - - 189 - 0 - - 1 - - - - 0 - - 333 - true - - 287 - - - true - true - 1 - false - 39872d87:13e14015f61:-3b80 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(R)MaxIOTime - - - - - - - Text Update - true - ###### - false - 0 - - - - 70 - 0 - - - 1 - - - - 0 - - 333 - false - $(pv_name) -$(pv_value) - 482 - - \ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 350 + + true + + modbusArrayTest + + + true + true + false + true + false + Display + 560 + 499 + 277 + + + false + true + 0.0 + + + + Array index + true + + + + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 0.0 + + + + Value + true + + + + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 0.0 + + + + Secondary Axis (2) + true + + + + true + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + true + 0.0 + + + + Secondary Axis (3) + true + + + + true + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 2 + false + + + + true + + + + 0 + 1 + true + false + + + + 275 + XY Graph + + + + + + + + true + true + false + + + true + false + true + Array data for $(P)$(R) + + Default Bold + + $(trace_0_y_pv) +$(trace_0_y_pv_value) + true + 0 + false + 1 + $(trace_0_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + $(P)$(R)ArrayIn + + true + 100 + true + 1 + $(trace_10_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_11_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_12_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_13_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_14_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_15_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_16_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_17_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_18_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_19_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_1_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_2_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_3_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_4_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_5_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_6_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_7_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_8_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_9_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + 1 + false + + + true + XY Graph + 550 + 5 + 5 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Severity + + true + 1 + true + Label + 80 + false + 375 + 288 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)ArrayIn.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 460 + 291 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 60 + false + 214 + 288 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(R)ArrayIn.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 279 + 291 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)ArrayIn.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 87 + 288 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 0 + Label + + + true + true + false + + + false + Update + + true + 1 + true + Label + 60 + false + 20 + 288 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(R)PollDelay + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 50 + 117 + 319 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Poll delay + + true + 1 + true + Label + 100 + false + 12 + 319 + + + + + asynRecord.opi + + true + A0:AsynOut + + 1 + asynRecord Out + + + asynRecord.opi + + true + A0:AsynIn + + 1 + asynRecord In + + + modbusStatistics.opi + + true + A0: + + 1 + I/O Statistics + + + false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 53 + 396 + 319 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Poll trigger + + true + 1 + true + Label + 120 + false + 194 + 319 + + + + + $(P)$(R)PollTrigger + 1 + 10 + + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + + Action Button + 0 + $(P)$(R)PollTrigger + + + + true + true + false + + + + Trigger + false + $(pv_name) +$(pv_value) + true + Action Button + 57 + 319 + 319 + + diff --git a/modbusApp/op/opi/autoconvert/modbusDataTypes.opi b/modbusApp/op/opi/autoconvert/modbusDataTypes.opi new file mode 100644 index 0000000..85b076d --- /dev/null +++ b/modbusApp/op/opi/autoconvert/modbusDataTypes.opi @@ -0,0 +1,12516 @@ + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 880 + + true + + modbusDataTypes + + + true + true + false + true + false + Display + 725 + 331 + 120 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 90 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 99 + 28 + 213 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int32 LE + + true + 1 + true + Label + 72 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int32 LE BS + + true + 1 + true + Label + 99 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int32 BE BS + + true + 1 + true + Label + 99 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int32 BE + + true + 1 + true + Label + 72 + false + 0 + 50 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 90 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 108 + 19 + 313 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt32 LE BS + + true + 1 + true + Label + 108 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt32 BE BS + + true + 1 + true + Label + 108 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt32 BE + + true + 1 + true + Label + 81 + false + 0 + 50 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt32 LE + + true + 1 + true + Label + 81 + false + 0 + 0 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 90 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 99 + 28 + 413 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int64 LE + + true + 1 + true + Label + 72 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int64 LE BS + + true + 1 + true + Label + 99 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int64 BE BS + + true + 1 + true + Label + 99 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int64 BE + + true + 1 + true + Label + 72 + false + 0 + 50 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 90 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 108 + 19 + 513 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt64 LE + + true + 1 + true + Label + 81 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt64 LE BS + + true + 1 + true + Label + 108 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt64 BE BS + + true + 1 + true + Label + 108 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt64 BE + + true + 1 + true + Label + 81 + false + 0 + 50 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 190 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 117 + 10 + 613 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float32 LE + + true + 1 + true + Label + 90 + false + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float32 LE BS + + true + 1 + true + Label + 117 + false + 0 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float32 BE + + true + 1 + true + Label + 90 + false + 0 + 50 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float32 BE BS + + true + 1 + true + Label + 117 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float64 LE + + true + 1 + true + Label + 90 + false + 0 + 100 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float64 LE BS + + true + 1 + true + Label + 117 + false + 0 + 125 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float64 BE + + true + 1 + true + Label + 90 + false + 0 + 150 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Float64 BE BS + + true + 1 + true + Label + 117 + false + 0 + 175 + + + + + false + + + + + + + 0 + 1 + true + + + + + + + 25 + 1 + Label + + + true + true + false + + + false + Modbus Data Type Test + + true + 1 + true + Label + 252 + false + 236 + 12 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)PollDelay + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 50 + 291 + 818 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + Poll delay + + true + 1 + true + Label + 90 + false + 346 + 821 + + + + + asynRecord.opi + + true + $(OUT)AsynOut + + 1 + asynRecord Out + + + asynRecord.opi + + true + $(OUT)AsynIn + + 1 + asynRecord In + + + modbusStatistics.opi + + true + $(OUT) + + 1 + I/O Statistics + + + false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 53 + 288 + 843 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + More + + true + 1 + true + Label + 36 + false + 346 + 846 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT16.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 85 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT16 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 88 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT16 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 85 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt16 + + true + 1 + true + Label + 54 + false + 73 + 88 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT16.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 88 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT16.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 88 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT16.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 88 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT16.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 88 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)BCD_UNSIGNED.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 110 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)BCD_UNSIGNED + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 113 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)BCD_UNSIGNED + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 110 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + UInt16 BCD + + true + 1 + true + Label + 90 + false + 37 + 113 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)BCD_UNSIGNED.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 113 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)BCD_UNSIGNED.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 113 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)BCD_UNSIGNED.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 113 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)BCD_UNSIGNED.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 113 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)BCD_SIGNED.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 135 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)BCD_SIGNED + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 138 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)BCD_SIGNED + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 135 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int16 BCD + + true + 1 + true + Label + 81 + false + 46 + 138 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)BCD_SIGNED.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 138 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)BCD_SIGNED.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 138 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)BCD_SIGNED.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 138 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)BCD_SIGNED.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 138 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT16.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 185 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT16 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 188 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT16 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 185 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int16 + + true + 1 + true + Label + 45 + false + 82 + 188 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT16.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 188 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT16.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 188 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT16.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 188 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT16.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 188 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT32_LE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 210 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_LE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 213 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT32_LE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 210 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 213 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 213 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 213 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 213 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT32_LE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 235 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_LE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 238 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT32_LE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 235 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 238 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 238 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 238 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 238 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT32_BE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 285 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_BE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 288 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT32_BE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 285 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 288 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 288 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 288 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 288 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT32_BE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 260 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 263 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT32_BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 260 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 263 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT32_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 263 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 263 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT32_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 263 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT32_LE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 310 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_LE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 313 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT32_LE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 310 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 313 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 313 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 313 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 313 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT32_LE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 335 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_LE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 338 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT32_LE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 335 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 338 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 338 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 338 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 338 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT32_BE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 385 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_BE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 388 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT32_BE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 385 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 388 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 388 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 388 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 388 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT32_BE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 360 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 363 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT32_BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 360 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 363 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT32_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 363 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 363 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT32_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 363 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT64_LE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 410 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_LE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 413 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT64_LE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 410 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 413 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 413 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 413 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 413 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT64_LE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 435 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_LE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 438 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT64_LE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 435 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 438 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 438 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 438 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 438 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT64_BE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 485 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_BE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 488 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT64_BE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 485 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 488 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 488 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 488 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 488 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT64_BE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 460 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 463 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT64_BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 460 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 463 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT64_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 463 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 463 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT64_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 463 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT64_LE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 510 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_LE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 513 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT64_LE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 510 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 513 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 513 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 513 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 513 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT64_LE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 535 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_LE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 538 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT64_LE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 535 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 538 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 538 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 538 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 538 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT64_BE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 585 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_BE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 588 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT64_BE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 585 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 588 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 588 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 588 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 588 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)UINT64_BE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 560 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 563 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)UINT64_BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 560 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 563 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)UINT64_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 563 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 563 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)UINT64_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 563 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT32_LE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 610 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_LE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 613 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT32_LE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 610 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 613 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 613 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 613 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 613 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT32_LE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 635 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_LE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 638 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT32_LE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 635 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 638 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 638 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 638 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 638 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT32_BE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 660 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 663 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT32_BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 660 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 663 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 663 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 663 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 663 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT32_BE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 685 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_BE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 688 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT32_BE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 685 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 688 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT32_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 688 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 688 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT32_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 688 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT64_LE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 710 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_LE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 713 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT64_LE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 710 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 713 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 713 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_LE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 713 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_LE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 713 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT64_LE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 735 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_LE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 738 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT64_LE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 735 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 738 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 738 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_LE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 738 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_LE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 738 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT64_BE.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 760 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_BE + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 763 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT64_BE + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 760 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 763 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 763 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_BE.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 763 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_BE.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 763 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)FLOAT64_BE_BS.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 785 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_BE_BS + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 788 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)FLOAT64_BE_BS + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 785 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 788 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)FLOAT64_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 788 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_BE_BS.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 788 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)FLOAT64_BE_BS.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 788 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(IN)INT16SM.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 617 + 160 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT16SM + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 377 + 163 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(OUT)INT16SM + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 132 + 160 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Int16 SM + + true + 1 + true + Label + 72 + false + 55 + 163 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT16SM.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 457 + 163 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(IN)INT16SM.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 537 + 163 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT16SM.STAT + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 217 + 163 + + + + false + false + false + + + + false + + + + 0 + 1 + true + + + + true + + + + 1 + 15 + 2 + Text Update + 0 + true + $(P)$(OUT)INT16SM.SEVR + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 75 + false + 297 + 163 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Scan + + true + 1 + true + Label + 40 + false + 662 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + $(IREC) + + true + 1 + true + Label + 70 + false + 394 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + $(OREC) + + true + 1 + true + Label + 70 + false + 152 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 60 + false + 479 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Severity + + true + 1 + true + Label + 80 + false + 549 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Status + + true + 1 + true + Label + 60 + false + 239 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Severity + + true + 1 + true + Label + 80 + false + 309 + 60 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + LE: Little-endian + + true + 1 + true + Label + 153 + false + 10 + 815 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + BE: Big-endian + + true + 1 + true + Label + 126 + false + 10 + 835 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + BS: Byte-swapped + + true + 1 + true + Label + 144 + false + 10 + 855 + + diff --git a/modbusApp/op/opi/modbusDataTypesTest.opi b/modbusApp/op/opi/autoconvert/modbusDataTypesTest.opi similarity index 80% rename from modbusApp/op/opi/modbusDataTypesTest.opi rename to modbusApp/op/opi/autoconvert/modbusDataTypesTest.opi index e5e0274..f4bdb7b 100644 --- a/modbusApp/op/opi/modbusDataTypesTest.opi +++ b/modbusApp/op/opi/autoconvert/modbusDataTypesTest.opi @@ -1,235 +1,248 @@ - - false - - true - - 39872d87:13e14015f61:-3b9a - 3.1.2.20120830 - - true - 120 - modbusDataTypesTest - false - false - - - - - - - Display - true - 170 - - true - 5 - - false - -1 - -1 - - - 100 - 100 - - true - 1 - 39872d87:13e14015f61:-3b99 - false - - 25 - Label - - true - true - false - - true - false - - - - - - - Label - true - Sim1 Test - - - - 146 - 0 - - 1 - - - - 1 - - 12 - true - - 12 - - - false - true - false - 39872d87:13e14015f61:-3b98 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 158 - 6 - - - - 1 - - - - 51 - - - modbusDataTypes.opi - - true -

SIM1:

- LO: - LI: - longout - longin -
- 0 - longout/longin -
- - modbusDataTypes.opi - - true -

SIM1:

- AO: - AI: - ao - ai -
- 0 - ao/ai -
- - Koyo_8inputs.opi - - true -

SIM1:

- BI - B - MBBID0 - BI - Bit -
- 0 - Binary inputs -
- - Koyo_8outputs.opi - - true -

SIM1:

- BO - B - MBBOD0 - BO - Bit -
- 0 - Binary outputs -
-
- $(pv_name) -$(pv_value) - 5 -
- - false - true - false - 39872d87:13e14015f61:-3b97 - - 25 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 158 - 6 - - - - 1 - - - - 81 - - - asynRecord.opi - - true -

SIM1:

- OctetAsyn -
- 0 - Octet asyn record -
- - - - true - - 0 - - -
- $(pv_name) -$(pv_value) - 7 -
-
\ No newline at end of file + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 120 + + true + + modbusDataTypesTest + + + true + true + false + true + false + Display + 170 + 100 + 100 + + + false + + + + + + + 0 + 1 + true + + + + + + + 25 + 1 + Label + + + true + true + false + + + false + Sim1 Test + + true + 1 + true + Label + 146 + false + 12 + 12 + + + + + modbusDataTypes.opi + + true +

SIM1:

+ LO: + LI: + longout + longin +
+ 1 + longout/longin +
+ + modbusDataTypes.opi + + true +

SIM1:

+ I64O: + I64I: + int64out + int64in +
+ 1 + int64out/int64in +
+ + modbusDataTypes.opi + + true +

SIM1:

+ AO: + AI: + ao + ai +
+ 1 + ao/ai +
+ + Koyo_8inputs.opi + + true +

SIM1:

+ BI + B + MBBID0 + BI + Bit +
+ 1 + Binary inputs +
+ + Koyo_8outputs.opi + + true +

SIM1:

+ BO + B + MBBOD0 + BO + Bit +
+ 1 + Binary outputs +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 158 + 5 + 51 +
+ + + + asynRecord.opi + + true +

SIM1:

+ OctetAsyn +
+ 1 + Octet asyn record +
+ + + + true + + 1 + + +
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 25 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 158 + 7 + 81 +
+
diff --git a/modbusApp/op/opi/autoconvert/modbusStatistics.opi b/modbusApp/op/opi/autoconvert/modbusStatistics.opi new file mode 100644 index 0000000..88d16d8 --- /dev/null +++ b/modbusApp/op/opi/autoconvert/modbusStatistics.opi @@ -0,0 +1,1452 @@ + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 375 + + true + + modbusStatistics + + + true + true + false + true + false + Display + 560 + 730 + 50 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 36 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 542 + 10 + 329 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 15 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 145 + 0 + 0 + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(R)ReadOK + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 70 + false + 75 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Read OK: + + true + 1 + true + Label + 72 + false + 0 + 0 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 15 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 265 + 0 + 21 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Last I/O Time (msec): + + true + 1 + true + Label + 189 + false + 0 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(R)LastIOTime + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 70 + false + 195 + 0 + + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(R)WriteOK + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 70 + false + 241 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Write OK: + + true + 1 + true + Label + 81 + false + 155 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(R)IOErrors + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 70 + false + 435 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + I/O Errors: + + true + 1 + true + Label + 99 + false + 332 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Max. I/O Time (msec): + + true + 1 + true + Label + 189 + false + 277 + 21 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(R)MaxIOTime + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 70 + false + 472 + 21 + + + + + false + true + 0.0 + + + + Write/read cycle time (msec) + true + + + + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 0.0 + + + + Number of events + true + + + + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 0.0 + + + + Secondary Axis (2) + true + + + + true + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + true + 0.0 + + + + Secondary Axis (3) + true + + + + true + false + 100.0 + 0.0 + + Default + + + true + 0 + + Default Bold + + true + true + 2 + false + + + + true + + + + 0 + 1 + true + false + + + + 275 + XY Graph + + + + + + + + true + true + false + + + true + false + true + Histogram of cycle times $(P)$(R) + + Default Bold + + $(trace_0_y_pv) +$(trace_0_y_pv_value) + true + 0 + false + 1 + $(trace_0_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + $(P)$(R)HistTimeAxis + + 1 + $(P)$(R)Hist + + true + 100 + true + 1 + $(trace_10_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_11_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_12_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_13_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_14_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_15_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_16_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_17_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_18_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_19_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_1_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_2_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_3_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_4_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_5_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_6_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_7_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_8_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + true + 100 + true + 1 + $(trace_9_y_pv) + 0 + 4 + 0 + + + + 0 + 100 + 0 + true + 0 + + + 1 + + + 1 + false + + + true + XY Graph + 550 + 5 + 5 + + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + true + + Choice 1 + Choice 2 + Choice 3 + + true + Choice Button + $(P)$(R)HistEnable + + + + true + true + false + + + + + + $(pv_name) +$(pv_value) + true + Choice Button + 150 + 202 + 286 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Enable histogramming: + + true + 1 + true + Label + 189 + false + 10 + 289 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(R)Statistics.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 437 + 286 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + Update: + + true + 1 + true + Label + 63 + false + 370 + 289 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 0 + Label + + + true + true + false + + + false + msec per bin + + true + 1 + true + Label + 72 + false + 11 + 309 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 15 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(R)MsPerBin + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 78 + 129 + 309 + + diff --git a/modbusApp/op/opi/autoconvert/modbusStringTest.opi b/modbusApp/op/opi/autoconvert/modbusStringTest.opi new file mode 100644 index 0000000..1fa61a1 --- /dev/null +++ b/modbusApp/op/opi/autoconvert/modbusStringTest.opi @@ -0,0 +1,2024 @@ + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 300 + + true + + modbusStringTest + + + true + true + false + true + false + Display + 1220 + 79 + 100 + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 20 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 94 + 578 + 266 + + + + asynRecord.opi + + true + OctetAsyn + + 1 + asynRecord + + + false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 20 + + Action Button + 0 + + + + + true + true + false + + + + + false + $(pv_name) +$(pv_value) + true + Action Button + 53 + 0 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 1 + Label + + + true + true + false + + + false + More + + true + 1 + true + Label + 36 + false + 58 + 3 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 190 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 700 + 409 + 69 + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(SI)High + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 0 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(SI)Low + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 25 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(SI)HighLow + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 50 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 15 + 0 + Text Update + 0 + true + $(P)$(SI)LowHigh + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 75 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 4 + 15 + 0 + Text Update + 0 + true + $(P)$(WFIN)High + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 100 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 4 + 15 + 0 + Text Update + 0 + true + $(P)$(WFIN)Low + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 125 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 4 + 15 + 0 + Text Update + 0 + true + $(P)$(WFIN)HighLow + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 150 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 4 + 15 + 0 + Text Update + 0 + true + $(P)$(WFIN)LowHigh + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 700 + false + 0 + 175 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 195 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 240 + 164 + 66 + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(SO)High + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 0 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(SO)Low + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 25 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(SO)HighLow + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 50 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(SO)LowHigh + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 75 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 4 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(WFOUT)High + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 100 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 4 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(WFOUT)Low + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 125 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 4 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(WFOUT)HighLow + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 150 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 4 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + $(P)$(WFOUT)LowHigh + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 240 + 0 + 175 + + + + + + + + + + + 0 + 1 + true + false + + Default + + + + + 190 + false + + true + + Grouping Container + + + true + true + false + + + false + + true + true + Grouping Container + 153 + 6 + 69 + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Stringout High + + true + 1 + true + Label + 126 + false + 27 + 0 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Stringout Low + + true + 1 + true + Label + 117 + false + 36 + 25 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Stringout HighLow + + true + 1 + true + Label + 153 + false + 0 + 50 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Stringout LowHigh + + true + 1 + true + Label + 153 + false + 0 + 75 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Waveform High + + true + 1 + true + Label + 117 + false + 36 + 100 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Waveform Low + + true + 1 + true + Label + 108 + false + 45 + 125 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Waveform HighLow + + true + 1 + true + Label + 144 + false + 9 + 150 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 15 + 2 + Label + + + true + true + false + + + false + Waveform LowHigh + + true + 1 + true + Label + 144 + false + 9 + 175 + + + + + false + + + + + + + 0 + 1 + true + + + + + + + 25 + 1 + Label + + + true + true + false + + + false + Modbus String Test + + true + 1 + true + Label + 216 + false + 502 + 12 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(SI)High.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 66 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(SI)Low.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 91 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(SI)HighLow.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 116 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(SI)LowHigh.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 141 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(WFIN)High.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 166 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(WFIN)Low.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 191 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(WFIN)HighLow.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 216 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + $(P)$(WFIN)LowHigh.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 100 + 1114 + 241 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Scan + + true + 1 + true + Label + 70 + false + 1129 + 42 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Input records + + true + 1 + true + Label + 130 + false + 714 + 42 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Output records + + true + 1 + true + Label + 140 + false + 213 + 42 + + diff --git a/modbusApp/op/opi/autoconvert/modbusStringTestTop.opi b/modbusApp/op/opi/autoconvert/modbusStringTestTop.opi new file mode 100644 index 0000000..e9e184f --- /dev/null +++ b/modbusApp/op/opi/autoconvert/modbusStringTestTop.opi @@ -0,0 +1,132 @@ + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 100 + + true + + modbusStringTestTop + + + true + true + false + true + false + Display + 280 + 147 + 151 + + + + modbusStringTest.opi + + true +

SIM1:

+ SO + SI + WFOut + WFIn +
+ 1 + Modbus String Test +
+
+ false + false + + + + false + + + + 0 + 1 + true + + Default + + false + + + + 25 + + Action Button + 0 + + + + + true + true + false + + + + StringTest + false + $(pv_name) +$(pv_value) + true + Action Button + 158 + 61 + 46 +
+ + + false + + + + + + + 0 + 1 + true + + + + + + + 25 + 1 + Label + + + true + true + false + + + false + Modbus String Test Top + + true + 1 + true + Label + 264 + false + 8 + 10 + +
diff --git a/modbusApp/op/opi/autoconvert/modbusTestSyncIO.opi b/modbusApp/op/opi/autoconvert/modbusTestSyncIO.opi new file mode 100644 index 0000000..5b942f3 --- /dev/null +++ b/modbusApp/op/opi/autoconvert/modbusTestSyncIO.opi @@ -0,0 +1,690 @@ + + + + false + -1 + -1 + + false + + + + 5.1.0 + + + + 5 + 205 + + true + + modbusTestSyncIO + + + true + true + false + true + false + Display + 350 + 644 + 65 + + + false + + + + + + + 0 + 1 + true + + + + + + + 25 + 1 + Label + + + true + true + false + + + false + SyncIO Test + + true + 1 + true + Label + 146 + false + 102 + 7 + + + + + asynRecord.opi + + true +

SIM1:

+ OctetAsyn +
+ 1 + Octet driver +
+ + asynRecord.opi + + true +

SIM1:

+ InputAsyn +
+ 1 + Modbus input driver +
+ + asynRecord.opi + + true +

SIM1:

+ OutputAsyn +
+ 1 + Modbus output driver +
+ + asynRecord.opi + + true +

SIM1:

+ SyncIOAsyn +
+ 1 + SyncIO driver +
+
+ false + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 120 + 115 + 175 +
+ + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Modbus input + + true + 1 + true + Label + 120 + false + 18 + 40 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + Modbus output + + true + 1 + true + Label + 130 + false + 8 + 65 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + SyncIO input + + true + 1 + true + Label + 120 + false + 18 + 90 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + SyncIO output + + true + 1 + true + Label + 130 + false + 8 + 115 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 20 + 1 + Text Update + 0 + true + SIM1:LI:UINT16 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 80 + false + 148 + 40 + + + + false + false + false + + + + true + + + + 0 + 1 + true + + + + false + + + + 1 + 20 + 1 + Text Update + 0 + true + SIM1:SYNC_IN:INT32 + + 0.0 + + + true + true + false + + + false + ###### + $(pv_name) +$(pv_value) + false + 1 + true + Text Update + 80 + false + 148 + 90 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + SIM1:LO:UINT16 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 148 + 65 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + SIM1:SYNC_OUT:INT32 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 148 + 115 + + + + true + false + false + + + + false + + + + 6 + 1 + true + + Default + + false + + + + 20 + + Menu Button + SIM1:SYNC_IN:INT32.SCAN + + + + true + true + false + + + false + $(pv_name) +$(pv_value) + false + true + Menu Button + 95 + 244 + 90 + + + + false + false + false + + + + false + + + + 3 + 1 + + true + + + + false + + + + 1 + 20 + 0 + false + Infinity + -Infinity + false + Text Input + 0 + false + 0 + true + SIM1:LOCK_OUT:INT32 + + false + 0.0 + + + true + true + false + + + 0 + false + true + false + false + + + $(pv_name) +$(pv_value) + false + true + Text Input + 80 + 148 + 140 + + + + false + + + + + + + 0 + 1 + true + + + + + + + 20 + 1 + Label + + + true + true + false + + + false + LockIO output + + true + 1 + true + Label + 130 + false + 8 + 140 + +
diff --git a/modbusApp/op/opi/modbusDataTypes.opi b/modbusApp/op/opi/modbusDataTypes.opi deleted file mode 100644 index 060dd40..0000000 --- a/modbusApp/op/opi/modbusDataTypes.opi +++ /dev/null @@ -1,4996 +0,0 @@ - - false - - true - - 39872d87:13e14015f61:-3c69 - 3.1.2.20120830 - - true - 450 - modbusDataTypes - false - false - - - - - - - Display - true - 840 - - true - 5 - - false - -1 - -1 - - - 420 - 580 - - - true - - true - 39872d87:13e14015f61:-3c3f - - 265 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 234 - 0 - - false - 1 - - - - - 86 - - 5 - - true - 1 - 39872d87:13e14015f61:-3c3e - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Unsigned 16-bit - - - - 135 - 0 - - 1 - - - - 1 - - 0 - true - - 99 - - - true - 1 - 39872d87:13e14015f61:-3c3d - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - BCD unsigned - - - - 108 - 0 - - 1 - - - - 1 - - 25 - true - - 126 - - - true - 1 - 39872d87:13e14015f61:-3c3c - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - BCD signed - - - - 90 - 0 - - 1 - - - - 1 - - 50 - true - - 144 - - - true - 1 - 39872d87:13e14015f61:-3c3b - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Signed 16-bit - - - - 117 - 0 - - 1 - - - - 1 - - 75 - true - - 117 - - - true - 1 - 39872d87:13e14015f61:-3c3a - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Default - - - - 63 - 0 - - 1 - - - - 1 - - 250 - true - - 171 - - - true - 1 - 39872d87:13e14015f61:-3c39 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - 32-bit int little-endian - - - - 216 - 0 - - 1 - - - - 1 - - 100 - true - - 18 - - - true - 1 - 39872d87:13e14015f61:-3c38 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - 32-bit int big-endian - - - - 189 - 0 - - 1 - - - - 1 - - 125 - true - - 45 - - - true - 1 - 39872d87:13e14015f61:-3c37 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - 32-bit float little-endian - - - - 234 - 0 - - 1 - - - - 1 - - 150 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3c36 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - 32-bit float big-endian - - - - 207 - 0 - - 1 - - - - 1 - - 175 - true - - 27 - - - true - 1 - 39872d87:13e14015f61:-3c35 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - 64-bit float little-endian - - - - 234 - 0 - - 1 - - - - 1 - - 200 - true - - 0 - - - true - 1 - 39872d87:13e14015f61:-3c34 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - 64-bit float big-endian - - - - 207 - 0 - - 1 - - - - 1 - - 225 - true - - 27 - - - - - true - - true - 39872d87:13e14015f61:-3c1b - - 292 - Grouping Container - - true - true - false - - true - false - - - - - - - Grouping Container - true - - Default - - 155 - 0 - - false - 1 - - - - - 59 - - 329 - - true - true - 1 - false - 39872d87:13e14015f61:-3c1a - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)UINT16.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 27 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c19 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)BCD_UNSIGNED.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 52 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c18 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)BCD_SIGNED.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 77 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c17 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)INT16.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 102 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c16 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)INT32_LE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 127 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c15 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)INT32_BE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 152 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c14 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT32_LE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 177 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c13 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT32_BE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 202 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c12 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT64_LE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 227 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c11 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT64_BE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 252 - false - $(pv_name) -$(pv_value) - 0 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c10 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)DEFAULT.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 277 - false - $(pv_name) -$(pv_value) - 0 - - - true - 1 - 39872d87:13e14015f61:-3c0f - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Status - - - - 70 - 0 - - 1 - - - - 1 - - 0 - true - - 2 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c0e - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)UINT16.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 27 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c0d - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)BCD_UNSIGNED.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 52 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c0c - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)BCD_SIGNED.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 77 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c0b - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)INT16.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 102 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c0a - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)INT32_LE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 127 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c09 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)INT32_BE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 152 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c08 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT32_LE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 177 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c07 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT32_BE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 202 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c06 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT64_LE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 227 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c05 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)FLOAT64_BE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 252 - false - $(pv_name) -$(pv_value) - 80 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c04 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(OUT)DEFAULT.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 277 - false - $(pv_name) -$(pv_value) - 80 - - - true - 1 - 39872d87:13e14015f61:-3c03 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Severity - - - - 70 - 0 - - 1 - - - - 1 - - 0 - true - - 82 - - - - true - 1 - 39872d87:13e14015f61:-3c68 - false - - 25 - Label - - true - true - false - - true - false - - - - - - - Label - true - Modbus Data Type Test - - - - 252 - 0 - - 1 - - - - 1 - - 12 - true - - 294 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 50 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c67 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)A0:PollDelay - - - - false - 0 - - - false - - - - 0 - - 372 - $(pv_name) -$(pv_value) - 360 - - - true - 1 - 39872d87:13e14015f61:-3c66 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - Poll delay - - - - 90 - 0 - - 1 - - - - 1 - - 375 - true - - 415 - - - false - true - false - 39872d87:13e14015f61:-3c65 - - 20 - Menu Button - false - - true - true - false - - false - - - - - - - - Menu Button - true - false - - Default - - 53 - 6 - - - - 1 - - - - 397 - - - asynRecord.opi - - true - A0:AsynOut - - 0 - asynRecord Out - - - asynRecord.opi - - true - A0:AsynIn - - 0 - asynRecord In - - - modbusStatistics.opi - - true - A0: - - 0 - I/O Statistics - - - $(pv_name) -$(pv_value) - 357 - - - true - 1 - 39872d87:13e14015f61:-3c64 - false - - 15 - Label - - true - true - false - - true - false - - - - - - - Label - true - More - - - - 36 - 0 - - 1 - - - - 1 - - 400 - true - - 415 - - - false - true - true - 39872d87:13e14015f61:-3c63 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)UINT16.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 83 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c62 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)BCD_UNSIGNED.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 108 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c61 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)BCD_SIGNED.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 133 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c60 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)INT16.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 158 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c5f - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)INT32_LE.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 183 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c5e - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)INT32_BE.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 208 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c5d - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)FLOAT32_LE.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 233 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c5c - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)FLOAT32_BE.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 258 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c5b - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)FLOAT64_LE.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 283 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c5a - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)FLOAT64_BE.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 308 - - $(pv_name) -$(pv_value) - 729 - - - false - true - true - 39872d87:13e14015f61:-3c59 - - 20 - Menu Button - false - - true - true - false - - false - $(P)$(IN)DEFAULT.SCAN - - - - - - - Menu Button - true - false - - Default - - 100 - 6 - - - - 1 - - - - 333 - - $(pv_name) -$(pv_value) - 729 - - - true - 1 - 39872d87:13e14015f61:-3c58 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Scan - - - - 70 - 0 - - 1 - - - - 1 - - 59 - true - - 744 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c57 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)UINT16 - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 86 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c56 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)BCD_UNSIGNED - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 111 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c55 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)BCD_SIGNED - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 136 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c54 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)INT16 - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 161 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c53 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)INT32_LE - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 186 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c52 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)INT32_BE - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 211 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c51 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT32_LE - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 236 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c50 - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT32_BE - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 261 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c4f - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT64_LE - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 286 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c4e - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT64_BE - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 311 - false - $(pv_name) -$(pv_value) - 489 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c4d - false - 0.0 - - 15 - Text Update - false - - true - true - false - - 1 - true - false - $(P)$(IN)DEFAULT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 336 - false - $(pv_name) -$(pv_value) - 489 - - - true - 1 - 39872d87:13e14015f61:-3c4c - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(IREC) - - - - 70 - 0 - - 1 - - - - 1 - - 59 - true - - 491 - - - true - 1 - 39872d87:13e14015f61:-3c4b - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - $(OREC) - - - - 70 - 0 - - 1 - - - - 1 - - 59 - true - - 249 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c4a - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)UINT16 - - - - false - 0 - - - false - - - - 0 - - 83 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c49 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)BCD_UNSIGNED - - - - false - 0 - - - false - - - - 0 - - 108 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c48 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)BCD_SIGNED - - - - false - 0 - - - false - - - - 0 - - 133 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c47 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)INT16 - - - - false - 0 - - - false - - - - 0 - - 158 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c46 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)INT32_LE - - - - false - 0 - - - false - - - - 0 - - 183 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c45 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)INT32_BE - - - - false - 0 - - - false - - - - 0 - - 208 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c44 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)FLOAT32_LE - - - - false - 0 - - - false - - - - 0 - - 233 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c43 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)FLOAT32_BE - - - - false - 0 - - - false - - - - 0 - - 258 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c42 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)FLOAT64_LE - - - - false - 0 - - - false - - - - 0 - - 283 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c41 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)FLOAT64_BE - - - - false - 0 - - - false - - - - 0 - - 308 - $(pv_name) -$(pv_value) - 244 - - - false - true - 1 - false - false - - 20 - false - true - - - - Text Input - true - - - - - 80 - 3 - - 1 - Infinity - -Infinity - false - 39872d87:13e14015f61:-3c40 - 0.0 - Text Input - - true - true - false - - 1 - false - 0 - $(P)$(OUT)DEFAULT - - - - false - 0 - - - false - - - - 0 - - 333 - $(pv_name) -$(pv_value) - 244 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c33 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)UINT16.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 86 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c32 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)BCD_UNSIGNED.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 111 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c31 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)BCD_SIGNED.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 136 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c30 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)INT16.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 161 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c2f - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)INT32_LE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 186 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c2e - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)INT32_BE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 211 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c2d - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT32_LE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 236 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c2c - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT32_BE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 261 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c2b - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT64_LE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 286 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c2a - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT64_BE.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 311 - false - $(pv_name) -$(pv_value) - 569 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c29 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)DEFAULT.STAT - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 336 - false - $(pv_name) -$(pv_value) - 569 - - - true - 1 - 39872d87:13e14015f61:-3c28 - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Status - - - - 70 - 0 - - 1 - - - - 1 - - 59 - true - - 571 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c27 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)UINT16.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 86 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c26 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)BCD_UNSIGNED.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 111 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c25 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)BCD_SIGNED.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 136 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c24 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)INT16.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 161 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c23 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)INT32_LE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 186 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c22 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)INT32_BE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 211 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c21 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT32_LE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 236 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c20 - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT32_BE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 261 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c1f - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT64_LE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 286 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c1e - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)FLOAT64_BE.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 311 - false - $(pv_name) -$(pv_value) - 649 - - - true - true - 1 - false - 39872d87:13e14015f61:-3c1d - false - 0.0 - - 15 - Text Update - true - - true - true - false - - 1 - true - false - $(P)$(IN)DEFAULT.SEVR - - - - - - - Text Update - true - ###### - false - 0 - - - - 75 - 0 - - - 1 - - - - 0 - - 336 - false - $(pv_name) -$(pv_value) - 649 - - - true - 1 - 39872d87:13e14015f61:-3c1c - false - - 20 - Label - - true - true - false - - true - false - - - - - - - Label - true - Severity - - - - 70 - 0 - - 1 - - - - 1 - - 59 - true - - 651 - - \ No newline at end of file diff --git a/modbusApp/op/ui/Koyo1.ui b/modbusApp/op/ui/autoconvert/Koyo1.ui similarity index 80% rename from modbusApp/op/ui/Koyo1.ui rename to modbusApp/op/ui/autoconvert/Koyo1.ui index a5e73e9..f0a0b33 100644 --- a/modbusApp/op/ui/Koyo1.ui +++ b/modbusApp/op/ui/autoconvert/Koyo1.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + diff --git a/modbusApp/op/ui/Koyo2.ui b/modbusApp/op/ui/autoconvert/Koyo2.ui similarity index 79% rename from modbusApp/op/ui/Koyo2.ui rename to modbusApp/op/ui/autoconvert/Koyo2.ui index 64faff4..474f60e 100644 --- a/modbusApp/op/ui/Koyo2.ui +++ b/modbusApp/op/ui/autoconvert/Koyo2.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + diff --git a/modbusApp/op/ui/Koyo_4ADC.ui b/modbusApp/op/ui/autoconvert/Koyo_4ADC.ui similarity index 95% rename from modbusApp/op/ui/Koyo_4ADC.ui rename to modbusApp/op/ui/autoconvert/Koyo_4ADC.ui index ca8bbe6..8c7ea88 100644 --- a/modbusApp/op/ui/Koyo_4ADC.ui +++ b/modbusApp/op/ui/autoconvert/Koyo_4ADC.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -50,7 +137,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 55 12 - 264 + 220 20 @@ -266,7 +353,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 85 64 - 36 + 27 15 diff --git a/modbusApp/op/ui/Koyo_8inputs.ui b/modbusApp/op/ui/autoconvert/Koyo_8inputs.ui similarity index 98% rename from modbusApp/op/ui/Koyo_8inputs.ui rename to modbusApp/op/ui/autoconvert/Koyo_8inputs.ui index 00c46e1..5ee179d 100644 --- a/modbusApp/op/ui/Koyo_8inputs.ui +++ b/modbusApp/op/ui/autoconvert/Koyo_8inputs.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -50,7 +137,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 110 5 - 216 + 180 20 @@ -915,7 +1002,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 9 0 - 108 + 90 15 @@ -2637,7 +2724,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 2 0 - 72 + 70 20 @@ -3159,7 +3246,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 80 0 - 96 + 80 20 diff --git a/modbusApp/op/ui/Koyo_8outputs.ui b/modbusApp/op/ui/autoconvert/Koyo_8outputs.ui similarity index 98% rename from modbusApp/op/ui/Koyo_8outputs.ui rename to modbusApp/op/ui/autoconvert/Koyo_8outputs.ui index 42ea23c..138b5c0 100644 --- a/modbusApp/op/ui/Koyo_8outputs.ui +++ b/modbusApp/op/ui/autoconvert/Koyo_8outputs.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -350,7 +437,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 90 5 - 228 + 180 20 @@ -2191,7 +2278,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 191 60 - 72 + 70 20 @@ -2713,7 +2800,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 269 60 - 96 + 80 20 diff --git a/modbusApp/op/ui/autoconvert/array_test.ui b/modbusApp/op/ui/autoconvert/array_test.ui new file mode 100644 index 0000000..6999a68 --- /dev/null +++ b/modbusApp/op/ui/autoconvert/array_test.ui @@ -0,0 +1,228 @@ + + +MainWindow + + + + 446 + 76 + 250 + 100 + + + + + +QWidget#centralWidget {background: rgba(187, 187, 187, 255);} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + + + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Array Test + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 65 + 7 + 120 + 25 + + + + + + + 98 + 58 + 120 + 20 + + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + Arrays + + + Menu + + + UINT16;INT16;INT32_LE;INT32_BE + + + modbusArrayTest.adl;modbusArrayTest.adl;modbusArrayTest.adl;modbusArrayTest.adl + + + P=SIM1:,R=UINT16:;P=SIM1:,R=INT16:;P=SIM1:,R=INT32_LE:;P=SIM1:,R=INT32_BE: + + + false;false;false;false + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Arrays + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 33 + 58 + 60 + 20 + + + + caLabel_0 + caLabel_1 + caRelatedDisplay_0 + + + \ No newline at end of file diff --git a/modbusApp/op/ui/modbusArray.ui b/modbusApp/op/ui/autoconvert/modbusArray.ui similarity index 85% rename from modbusApp/op/ui/modbusArray.ui rename to modbusApp/op/ui/autoconvert/modbusArray.ui index c096f5a..d65f709 100644 --- a/modbusApp/op/ui/modbusArray.ui +++ b/modbusApp/op/ui/autoconvert/modbusArray.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -124,7 +211,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 375 287 - 96 + 80 20 @@ -214,7 +301,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 214 287 - 72 + 60 20 diff --git a/modbusApp/op/ui/autoconvert/modbusArrayTest.ui b/modbusApp/op/ui/autoconvert/modbusArrayTest.ui new file mode 100644 index 0000000..766a875 --- /dev/null +++ b/modbusApp/op/ui/autoconvert/modbusArrayTest.ui @@ -0,0 +1,647 @@ + + +MainWindow + + + + 499 + 277 + 560 + 350 + + + + + +QWidget#centralWidget {background: rgba(187, 187, 187, 255);} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + + + + + + + + + 5 + 5 + 550 + 275 + + + + Array data for $(P)$(R) + + + Array index + + + Value + + + + 0 + 0 + 0 + + + + + 174 + 174 + 174 + + + + + 174 + 174 + 174 + + + + caCartesianPlot::FillUnder + + + caCartesianPlot::FillUnder + + + caCartesianPlot::FillUnder + + + caCartesianPlot::NoSymbol + + + caCartesianPlot::Rect + + + caCartesianPlot::Triangle + + + + 10 + 0 + 184 + + + + ;$(P)$(R)ArrayIn + + + caCartesianPlot::Channel + + + caCartesianPlot::Channel + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Severity + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 375 + 288 + 80 + 20 + + + + + + + 460 + 291 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(R)ArrayIn.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Status + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 214 + 288 + 60 + 20 + + + + + + + 279 + 291 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(R)ArrayIn.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 87 + 288 + 100 + 20 + + + + $(P)$(R)ArrayIn.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Update + + + ESimpleLabel::WidthAndHeight + + + + 20 + 288 + 60 + 20 + + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + + + + 117 + 319 + 50 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(R)PollDelay + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Poll delay + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 12 + 319 + 100 + 20 + + + + + + + 396 + 319 + 53 + 20 + + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + More + + + Menu + + + asynRecord Out;asynRecord In;I/O Statistics + + + asynRecord.adl;asynRecord.adl;modbusStatistics.adl + + + P=$(P), R=A0:AsynOut;P=$(P), R=A0:AsynIn;P=$(P), R=A0: + + + false;false;false + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Poll trigger + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 194 + 319 + 120 + 20 + + + + + + + 319 + 319 + 57 + 20 + + + + EPushButton::WidthAndHeight + + + $(P)$(R)PollTrigger + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + Trigger + + + 1 + + + caMessageButton::Static + + + caLabel_0 + caLabel_1 + caLabel_2 + caLabel_3 + caLabel_4 + caCartesianPlot_0 + caLineEdit_0 + caLineEdit_1 + caMenu_0 + caTextEntry_0 + caRelatedDisplay_0 + caMessageButton_0 + + + \ No newline at end of file diff --git a/modbusApp/op/ui/autoconvert/modbusDataTypes.ui b/modbusApp/op/ui/autoconvert/modbusDataTypes.ui new file mode 100644 index 0000000..998d9ee --- /dev/null +++ b/modbusApp/op/ui/autoconvert/modbusDataTypes.ui @@ -0,0 +1,12194 @@ + + +MainWindow + + + + 331 + 120 + 725 + 880 + + + + + +QWidget#centralWidget {background: rgba(187, 187, 187, 255);} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + + + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Modbus Data Type Test + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 236 + 12 + 252 + 25 + + + + + + + 291 + 818 + 50 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)PollDelay + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Poll delay + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 346 + 821 + 90 + 15 + + + + + + + 288 + 843 + 53 + 20 + + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + Menu + + + asynRecord Out;asynRecord In;I/O Statistics + + + asynRecord.adl;asynRecord.adl;modbusStatistics.adl + + + P=$(P), R=$(OUT)AsynOut;P=$(P), R=$(OUT)AsynIn;P=$(P), R=$(OUT) + + + false;false;false + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + More + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 346 + 846 + 36 + 15 + + + + + + + 617 + 85 + 100 + 20 + + + + $(P)$(IN)UINT16.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 88 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT16 + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 85 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT16 + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt16 + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 73 + 88 + 54 + 15 + + + + + + + 457 + 88 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT16.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 88 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT16.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 88 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT16.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 88 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT16.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 110 + 100 + 20 + + + + $(P)$(IN)BCD_UNSIGNED.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 113 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)BCD_UNSIGNED + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 110 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)BCD_UNSIGNED + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt16 BCD + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 37 + 113 + 90 + 15 + + + + + + + 457 + 113 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)BCD_UNSIGNED.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 113 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)BCD_UNSIGNED.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 113 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)BCD_UNSIGNED.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 113 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)BCD_UNSIGNED.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 135 + 100 + 20 + + + + $(P)$(IN)BCD_SIGNED.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 138 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)BCD_SIGNED + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 135 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)BCD_SIGNED + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int16 BCD + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 46 + 138 + 81 + 15 + + + + + + + 457 + 138 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)BCD_SIGNED.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 138 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)BCD_SIGNED.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 138 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)BCD_SIGNED.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 138 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)BCD_SIGNED.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 185 + 100 + 20 + + + + $(P)$(IN)INT16.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 188 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT16 + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 185 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT16 + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int16 + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 82 + 188 + 45 + 15 + + + + + + + 457 + 188 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT16.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 188 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT16.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 188 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT16.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 188 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT16.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 210 + 100 + 20 + + + + $(P)$(IN)INT32_LE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 213 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_LE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 210 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_LE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 213 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 213 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 213 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 213 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 235 + 100 + 20 + + + + $(P)$(IN)INT32_LE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 238 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_LE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 235 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_LE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 238 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 238 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 238 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 238 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 285 + 100 + 20 + + + + $(P)$(IN)INT32_BE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 288 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_BE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 285 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_BE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 288 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 288 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 288 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 288 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 260 + 100 + 20 + + + + $(P)$(IN)INT32_BE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 263 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_BE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 260 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_BE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 263 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 263 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT32_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 263 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 263 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT32_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 310 + 100 + 20 + + + + $(P)$(IN)UINT32_LE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 313 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_LE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 310 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_LE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 313 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 313 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 313 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 313 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 335 + 100 + 20 + + + + $(P)$(IN)UINT32_LE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 338 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_LE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 335 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_LE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 338 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 338 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 338 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 338 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 385 + 100 + 20 + + + + $(P)$(IN)UINT32_BE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 388 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_BE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 385 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_BE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 388 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 388 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 388 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 388 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 360 + 100 + 20 + + + + $(P)$(IN)UINT32_BE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 363 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_BE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 360 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_BE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 363 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 363 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT32_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 363 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 363 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT32_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 410 + 100 + 20 + + + + $(P)$(IN)INT64_LE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 413 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_LE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 410 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_LE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 413 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 413 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 413 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 413 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 435 + 100 + 20 + + + + $(P)$(IN)INT64_LE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 438 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_LE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 435 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_LE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 438 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 438 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 438 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 438 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 485 + 100 + 20 + + + + $(P)$(IN)INT64_BE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 488 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_BE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 485 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_BE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 488 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 488 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 488 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 488 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 460 + 100 + 20 + + + + $(P)$(IN)INT64_BE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 463 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_BE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 460 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_BE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 463 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 463 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT64_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 463 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 463 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT64_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 510 + 100 + 20 + + + + $(P)$(IN)UINT64_LE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 513 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_LE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 510 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_LE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 513 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 513 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 513 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 513 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 535 + 100 + 20 + + + + $(P)$(IN)UINT64_LE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 538 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_LE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 535 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_LE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 538 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 538 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 538 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 538 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 585 + 100 + 20 + + + + $(P)$(IN)UINT64_BE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 588 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_BE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 585 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_BE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 588 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 588 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 588 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 588 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 560 + 100 + 20 + + + + $(P)$(IN)UINT64_BE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 563 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_BE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 560 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_BE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 563 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 563 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)UINT64_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 563 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 563 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)UINT64_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 610 + 100 + 20 + + + + $(P)$(IN)FLOAT32_LE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 613 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_LE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 610 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_LE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 613 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 613 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 613 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 613 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 635 + 100 + 20 + + + + $(P)$(IN)FLOAT32_LE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 638 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_LE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 635 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_LE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 638 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 638 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 638 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 638 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 660 + 100 + 20 + + + + $(P)$(IN)FLOAT32_BE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 663 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_BE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 660 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_BE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 663 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 663 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 663 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 663 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 685 + 100 + 20 + + + + $(P)$(IN)FLOAT32_BE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 688 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_BE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 685 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_BE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 688 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 688 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT32_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 688 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 688 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT32_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 710 + 100 + 20 + + + + $(P)$(IN)FLOAT64_LE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 713 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_LE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 710 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_LE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 713 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 713 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 713 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_LE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 713 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_LE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 735 + 100 + 20 + + + + $(P)$(IN)FLOAT64_LE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 738 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_LE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 735 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_LE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 738 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 738 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 738 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_LE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 738 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_LE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 760 + 100 + 20 + + + + $(P)$(IN)FLOAT64_BE.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 763 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_BE + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 760 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_BE + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 763 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 763 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 763 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_BE.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 763 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_BE.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 785 + 100 + 20 + + + + $(P)$(IN)FLOAT64_BE_BS.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 788 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_BE_BS + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 785 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_BE_BS + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 457 + 788 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 788 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)FLOAT64_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 788 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_BE_BS.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 788 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)FLOAT64_BE_BS.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 617 + 160 + 100 + 20 + + + + $(P)$(IN)INT16SM.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 377 + 163 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT16SM + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Static + + + + + + 132 + 160 + 80 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT16SM + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int16 SM + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 55 + 163 + 72 + 15 + + + + + + + 457 + 163 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT16SM.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 537 + 163 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(IN)INT16SM.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 217 + 163 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT16SM.STAT + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + + 297 + 163 + 75 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(OUT)INT16SM.SEVR + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + decimal + + + caLineEdit::Alarm_Static + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Scan + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 662 + 60 + 40 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + $(IREC) + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 394 + 60 + 70 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + $(OREC) + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 152 + 60 + 70 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Status + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 479 + 60 + 60 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Severity + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 549 + 60 + 80 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Status + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 239 + 60 + 60 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Severity + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 309 + 60 + 80 + 20 + + + + + + + 28 + 213 + 101 + 92 + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int32 LE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 0 + 72 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int32 LE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 25 + 99 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int32 BE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 75 + 99 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int32 BE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 50 + 72 + 15 + + + + + + + + 19 + 313 + 110 + 92 + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt32 LE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 25 + 108 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt32 BE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 75 + 108 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt32 BE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 50 + 81 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt32 LE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 0 + 81 + 15 + + + + + + + + 28 + 413 + 101 + 92 + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int64 LE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 0 + 72 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int64 LE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 25 + 99 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int64 BE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 75 + 99 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Int64 BE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 50 + 72 + 15 + + + + + + + + 19 + 513 + 110 + 92 + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt64 LE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 0 + 81 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt64 LE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 25 + 108 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt64 BE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 75 + 108 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + UInt64 BE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 50 + 81 + 15 + + + + + + + + 10 + 613 + 119 + 192 + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float32 LE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 0 + 90 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float32 LE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 25 + 117 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float32 BE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 50 + 90 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float32 BE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 75 + 117 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float64 LE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 100 + 90 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float64 LE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 125 + 117 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float64 BE + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 150 + 90 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Float64 BE BS + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 175 + 117 + 15 + + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + LE: Little-endian + + + ESimpleLabel::WidthAndHeight + + + + 10 + 815 + 153 + 15 + + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + BE: Big-endian + + + ESimpleLabel::WidthAndHeight + + + + 10 + 835 + 126 + 15 + + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + BS: Byte-swapped + + + ESimpleLabel::WidthAndHeight + + + + 10 + 855 + 144 + 15 + + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + caLabel_0 + caLabel_1 + caLabel_2 + caLabel_3 + caLabel_4 + caLabel_5 + caLabel_6 + caLabel_7 + caLabel_8 + caLabel_9 + caLabel_10 + caLabel_11 + caLabel_12 + caLabel_13 + caLabel_14 + caLabel_15 + caLabel_16 + caLabel_17 + caLabel_18 + caFrame_0 + caLabel_19 + caLabel_20 + caLabel_21 + caLabel_22 + caFrame_1 + caLabel_23 + caLabel_24 + caLabel_25 + caLabel_26 + caFrame_2 + caLabel_27 + caLabel_28 + caLabel_29 + caLabel_30 + caFrame_3 + caLabel_31 + caLabel_32 + caLabel_33 + caLabel_34 + caLabel_35 + caLabel_36 + caLabel_37 + caLabel_38 + caFrame_4 + caLabel_39 + caLabel_40 + caLabel_41 + caTextEntry_0 + caRelatedDisplay_0 + caMenu_0 + caLineEdit_0 + caTextEntry_1 + caLineEdit_1 + caLineEdit_2 + caLineEdit_3 + caLineEdit_4 + caMenu_1 + caLineEdit_5 + caTextEntry_2 + caLineEdit_6 + caLineEdit_7 + caLineEdit_8 + caLineEdit_9 + caMenu_2 + caLineEdit_10 + caTextEntry_3 + caLineEdit_11 + caLineEdit_12 + caLineEdit_13 + caLineEdit_14 + caMenu_3 + caLineEdit_15 + caTextEntry_4 + caLineEdit_16 + caLineEdit_17 + caLineEdit_18 + caLineEdit_19 + caMenu_4 + caLineEdit_20 + caTextEntry_5 + caLineEdit_21 + caLineEdit_22 + caLineEdit_23 + caLineEdit_24 + caMenu_5 + caLineEdit_25 + caTextEntry_6 + caLineEdit_26 + caLineEdit_27 + caLineEdit_28 + caLineEdit_29 + caMenu_6 + caLineEdit_30 + caTextEntry_7 + caLineEdit_31 + caLineEdit_32 + caLineEdit_33 + caLineEdit_34 + caMenu_7 + caLineEdit_35 + caTextEntry_8 + caLineEdit_36 + caLineEdit_37 + caLineEdit_38 + caLineEdit_39 + caMenu_8 + caLineEdit_40 + caTextEntry_9 + caLineEdit_41 + caLineEdit_42 + caLineEdit_43 + caLineEdit_44 + caMenu_9 + caLineEdit_45 + caTextEntry_10 + caLineEdit_46 + caLineEdit_47 + caLineEdit_48 + caLineEdit_49 + caMenu_10 + caLineEdit_50 + caTextEntry_11 + caLineEdit_51 + caLineEdit_52 + caLineEdit_53 + caLineEdit_54 + caMenu_11 + caLineEdit_55 + caTextEntry_12 + caLineEdit_56 + caLineEdit_57 + caLineEdit_58 + caLineEdit_59 + caMenu_12 + caLineEdit_60 + caTextEntry_13 + caLineEdit_61 + caLineEdit_62 + caLineEdit_63 + caLineEdit_64 + caMenu_13 + caLineEdit_65 + caTextEntry_14 + caLineEdit_66 + caLineEdit_67 + caLineEdit_68 + caLineEdit_69 + caMenu_14 + caLineEdit_70 + caTextEntry_15 + caLineEdit_71 + caLineEdit_72 + caLineEdit_73 + caLineEdit_74 + caMenu_15 + caLineEdit_75 + caTextEntry_16 + caLineEdit_76 + caLineEdit_77 + caLineEdit_78 + caLineEdit_79 + caMenu_16 + caLineEdit_80 + caTextEntry_17 + caLineEdit_81 + caLineEdit_82 + caLineEdit_83 + caLineEdit_84 + caMenu_17 + caLineEdit_85 + caTextEntry_18 + caLineEdit_86 + caLineEdit_87 + caLineEdit_88 + caLineEdit_89 + caMenu_18 + caLineEdit_90 + caTextEntry_19 + caLineEdit_91 + caLineEdit_92 + caLineEdit_93 + caLineEdit_94 + caMenu_19 + caLineEdit_95 + caTextEntry_20 + caLineEdit_96 + caLineEdit_97 + caLineEdit_98 + caLineEdit_99 + caMenu_20 + caLineEdit_100 + caTextEntry_21 + caLineEdit_101 + caLineEdit_102 + caLineEdit_103 + caLineEdit_104 + caMenu_21 + caLineEdit_105 + caTextEntry_22 + caLineEdit_106 + caLineEdit_107 + caLineEdit_108 + caLineEdit_109 + caMenu_22 + caLineEdit_110 + caTextEntry_23 + caLineEdit_111 + caLineEdit_112 + caLineEdit_113 + caLineEdit_114 + caMenu_23 + caLineEdit_115 + caTextEntry_24 + caLineEdit_116 + caLineEdit_117 + caLineEdit_118 + caLineEdit_119 + caMenu_24 + caLineEdit_120 + caTextEntry_25 + caLineEdit_121 + caLineEdit_122 + caLineEdit_123 + caLineEdit_124 + caMenu_25 + caLineEdit_125 + caTextEntry_26 + caLineEdit_126 + caLineEdit_127 + caLineEdit_128 + caLineEdit_129 + caMenu_26 + caLineEdit_130 + caTextEntry_27 + caLineEdit_131 + caLineEdit_132 + caLineEdit_133 + caLineEdit_134 + caMenu_27 + caLineEdit_135 + caTextEntry_28 + caLineEdit_136 + caLineEdit_137 + caLineEdit_138 + caLineEdit_139 + caMenu_28 + caLineEdit_140 + caTextEntry_29 + caLineEdit_141 + caLineEdit_142 + caLineEdit_143 + caLineEdit_144 + + + \ No newline at end of file diff --git a/modbusApp/op/ui/modbusDataTypesTest.ui b/modbusApp/op/ui/autoconvert/modbusDataTypesTest.ui similarity index 66% rename from modbusApp/op/ui/modbusDataTypesTest.ui rename to modbusApp/op/ui/autoconvert/modbusDataTypesTest.ui index 6b99281..087e9c0 100644 --- a/modbusApp/op/ui/modbusDataTypesTest.ui +++ b/modbusApp/op/ui/autoconvert/modbusDataTypesTest.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -85,16 +172,16 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} Menu - longout/longin;ao/ai;Binary inputs;Binary outputs + longout/longin;int64out/int64in;ao/ai;Binary inputs;Binary outputs - modbusDataTypes.adl;modbusDataTypes.adl;Koyo_8inputs.adl;Koyo_8outputs.adl + modbusDataTypes.adl;modbusDataTypes.adl;modbusDataTypes.adl;Koyo_8inputs.adl;Koyo_8outputs.adl - P=SIM1:,OUT=LO:,IN=LI:,OREC=longout,IREC=longin;P=SIM1:,OUT=AO:,IN=AI:,OREC=ao,IREC=ai;P=SIM1:,R=BI,A=B,L=MBBID0,PORT=BI,AC=Bit;P=SIM1:,R=BO,A=B,L=MBBOD0,PORT=BO,AC=Bit + P=SIM1:,OUT=LO:,IN=LI:,OREC=longout,IREC=longin;P=SIM1:,OUT=I64O:,IN=I64I:,OREC=int64out,IREC=int64in;P=SIM1:,OUT=AO:,IN=AI:,OREC=ao,IREC=ai;P=SIM1:,R=BI,A=B,L=MBBID0,PORT=BI,AC=Bit;P=SIM1:,R=BO,A=B,L=MBBOD0,PORT=BO,AC=Bit - false;false;false;false + false;false;false;false;false diff --git a/modbusApp/op/ui/modbusStatistics.ui b/modbusApp/op/ui/autoconvert/modbusStatistics.ui similarity index 93% rename from modbusApp/op/ui/modbusStatistics.ui rename to modbusApp/op/ui/autoconvert/modbusStatistics.ui index a5aeed6..4dee585 100644 --- a/modbusApp/op/ui/modbusStatistics.ui +++ b/modbusApp/op/ui/autoconvert/modbusStatistics.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -256,7 +343,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 11 309 - 108 + 72 15 diff --git a/modbusApp/op/ui/autoconvert/modbusStringTest.ui b/modbusApp/op/ui/autoconvert/modbusStringTest.ui new file mode 100644 index 0000000..d0588db --- /dev/null +++ b/modbusApp/op/ui/autoconvert/modbusStringTest.ui @@ -0,0 +1,1780 @@ + + +MainWindow + + + + 79 + 100 + 1220 + 300 + + + + + +QWidget#centralWidget {background: rgba(187, 187, 187, 255);} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + + + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Modbus String Test + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 502 + 12 + 216 + 25 + + + + + + + 578 + 266 + 96 + 22 + + + + + + 0 + 0 + 53 + 20 + + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + Menu + + + asynRecord + + + asynRecord.adl + + + P=$(P), R=OctetAsyn + + + false + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + More + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 58 + 3 + 36 + 15 + + + + + + + + 1114 + 66 + 100 + 20 + + + + $(P)$(SI)High.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 91 + 100 + 20 + + + + $(P)$(SI)Low.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 116 + 100 + 20 + + + + $(P)$(SI)HighLow.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 141 + 100 + 20 + + + + $(P)$(SI)LowHigh.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 166 + 100 + 20 + + + + $(P)$(WFIN)High.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 191 + 100 + 20 + + + + $(P)$(WFIN)Low.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 216 + 100 + 20 + + + + $(P)$(WFIN)HighLow.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + + 1114 + 241 + 100 + 20 + + + + $(P)$(WFIN)LowHigh.SCAN + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + caMenu::Static + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Scan + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 1129 + 42 + 70 + 20 + + + + + + + 409 + 69 + 702 + 192 + + + + + + 0 + 0 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SI)High + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + decimal + + + caLineEdit::Static + + + + + + 0 + 25 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SI)Low + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + decimal + + + caLineEdit::Static + + + + + + 0 + 50 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SI)HighLow + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + decimal + + + caLineEdit::Static + + + + + + 0 + 75 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SI)LowHigh + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + decimal + + + caLineEdit::Static + + + + + + 0 + 100 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFIN)High + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + string + + + caLineEdit::Static + + + + + + 0 + 125 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFIN)Low + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + string + + + caLineEdit::Static + + + + + + 0 + 150 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFIN)HighLow + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + string + + + caLineEdit::Static + + + + + + 0 + 175 + 700 + 15 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFIN)LowHigh + + + + 42 + 99 + 228 + + + + + 218 + 218 + 218 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + Qt::AlignAbsolute|Qt::AlignLeft|Qt::AlignVCenter + + + string + + + caLineEdit::Static + + + + + + + 164 + 66 + 242 + 197 + + + + + + 0 + 0 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SO)High + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 0 + 25 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SO)Low + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 0 + 50 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SO)HighLow + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 0 + 75 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(SO)LowHigh + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + decimal + + + + + + 0 + 100 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFOUT)High + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + string + + + + + + 0 + 125 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFOUT)Low + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + string + + + + + + 0 + 150 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFOUT)HighLow + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + string + + + + + + 0 + 175 + 240 + 20 + + + + caLineEdit::WidthAndHeight + + + $(P)$(WFOUT)LowHigh + + + + 0 + 0 + 0 + + + + + 115 + 223 + 255 + + + + caLineEdit::Channel + + + caLineEdit::Channel + + + caLineEdit::Channel + + + 0.0 + + + 1.0 + + + caLineEdit::Static + + + string + + + + + + + 6 + 69 + 155 + 192 + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Stringout High + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 27 + 0 + 126 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Stringout Low + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 36 + 25 + 117 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Stringout HighLow + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 50 + 153 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Stringout LowHigh + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 0 + 75 + 153 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Waveform High + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 36 + 100 + 117 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Waveform Low + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 45 + 125 + 108 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Waveform HighLow + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 9 + 150 + 144 + 15 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Waveform LowHigh + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter + + + + 9 + 175 + 144 + 15 + + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Input records + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 714 + 42 + 130 + 20 + + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Output records + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 213 + 42 + 140 + 20 + + + + caLabel_0 + caLabel_1 + caFrame_0 + caLabel_2 + caFrame_1 + caFrame_2 + caLabel_3 + caLabel_4 + caLabel_5 + caLabel_6 + caLabel_7 + caLabel_8 + caLabel_9 + caLabel_10 + caFrame_3 + caLabel_11 + caLabel_12 + caRelatedDisplay_0 + caMenu_0 + caMenu_1 + caMenu_2 + caMenu_3 + caMenu_4 + caMenu_5 + caMenu_6 + caMenu_7 + caLineEdit_0 + caLineEdit_1 + caLineEdit_2 + caLineEdit_3 + caLineEdit_4 + caLineEdit_5 + caLineEdit_6 + caLineEdit_7 + caTextEntry_0 + caTextEntry_1 + caTextEntry_2 + caTextEntry_3 + caTextEntry_4 + caTextEntry_5 + caTextEntry_6 + caTextEntry_7 + + + \ No newline at end of file diff --git a/modbusApp/op/ui/autoconvert/modbusStringTestTop.ui b/modbusApp/op/ui/autoconvert/modbusStringTestTop.ui new file mode 100644 index 0000000..7a839bb --- /dev/null +++ b/modbusApp/op/ui/autoconvert/modbusStringTestTop.ui @@ -0,0 +1,191 @@ + + +MainWindow + + + + 147 + 151 + 280 + 100 + + + + + +QWidget#centralWidget {background: rgba(187, 187, 187, 255);} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + + + + + + + + + 61 + 46 + 158 + 25 + + + + + 0 + 0 + 0 + + + + + 187 + 187 + 187 + + + + StringTest + + + Menu + + + Modbus String Test + + + modbusStringTest.adl + + + P=SIM1:,SO=SO,SI=SI,WFOUT=WFOut,WFIN=WFIn + + + false + + + + + QFrame::NoFrame + + + + 0 + 0 + 0 + + + + + 0 + 0 + 0 + + + + Modbus String Test Top + + + ESimpleLabel::WidthAndHeight + + + Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter + + + + 8 + 10 + 264 + 25 + + + + caLabel_0 + caRelatedDisplay_0 + + + \ No newline at end of file diff --git a/modbusApp/op/ui/modbusTestSyncIO.ui b/modbusApp/op/ui/autoconvert/modbusTestSyncIO.ui similarity index 89% rename from modbusApp/op/ui/modbusTestSyncIO.ui rename to modbusApp/op/ui/autoconvert/modbusTestSyncIO.ui index c015f8c..d107187 100644 --- a/modbusApp/op/ui/modbusTestSyncIO.ui +++ b/modbusApp/op/ui/autoconvert/modbusTestSyncIO.ui @@ -14,7 +14,94 @@ QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} + +caTable { + font: 10pt; + background: cornsilk; + alternate-background-color: wheat; +} + +caLineEdit { + border-radius: 1px; + background: lightyellow; + color: black; + } + +caTextEntry { + color: rgb(127, 0, 63); + background-color: cornsilk; + selection-color: #0a214c; + selection-background-color: wheat; + border: 1px groove black; + border-radius: 1px; + padding: 1px; +} + +caTextEntry:focus { + padding: 0px; + border: 2px groove darkred; + border-radius: 1px; +} + +QPushButton { + border-color: #00b; + border-radius: 2px; + padding: 3px; + border-width: 1px; + + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(224, 239, 255, 255), + stop:0.5 rgba(199, 215, 230, 255), + stop:1 rgba(184, 214, 236, 255)); +} +QPushButton:hover { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(201, 226, 255, 255), + stop:0.5 rgba(177, 204, 230, 255), + stop:1 rgba(163, 205, 236, 255)); +} +QPushButton:pressed { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +QPushButton:disabled { + background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, + stop:0 rgba(174, 219, 255, 255), + stop:0.5 rgba(165, 199, 230, 255), + stop:1 rgba(134, 188, 236, 255)); +} + +caChoice { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #E1E1E1, stop: 0.4 #DDDDDD, + stop: 0.5 #D8D8D8, stop: 1.0 #D3D3D3); +} + +caChoice > QPushButton { + text-align: left; + padding: 1px; +} + +caSlider::groove:horizontal { +border: 1px solid #bbb; +background: lightgrey; +height: 20px; +border-radius: 4px; +} + +caSlider::handle:horizontal { +background: red; +border: 1px solid #777; +width: 13px; +margin-top: -2px; +margin-bottom: -2px; +border-radius: 2px; +} + + @@ -50,7 +137,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 102 7 - 165 + 146 25 @@ -128,7 +215,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 18 40 - 144 + 120 20 @@ -164,7 +251,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 8 65 - 156 + 130 20 @@ -200,7 +287,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 18 90 - 144 + 120 20 @@ -236,7 +323,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 8 115 - 156 + 130 20 @@ -563,7 +650,7 @@ QPushButton::menu-indicator {image: url(none.png); width: 0} 8 140 - 156 + 130 20 diff --git a/modbusApp/op/ui/modbusDataTypes.ui b/modbusApp/op/ui/modbusDataTypes.ui deleted file mode 100644 index a7c0e95..0000000 --- a/modbusApp/op/ui/modbusDataTypes.ui +++ /dev/null @@ -1,4853 +0,0 @@ - - -MainWindow - - - - 580 - 420 - 840 - 450 - - - - - -QWidget#centralWidget {background: rgba(187, 187, 187, 255);} -QPushButton::menu-indicator {image: url(none.png); width: 0} - - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Modbus Data Type Test - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 294 - 12 - 315 - 25 - - - - - - - 360 - 372 - 50 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)A0:PollDelay - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Poll delay - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 415 - 375 - 90 - 15 - - - - - - - 357 - 397 - 53 - 20 - - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - Menu - - - asynRecord Out;asynRecord In;I/O Statistics - - - asynRecord.adl;asynRecord.adl;modbusStatistics.adl - - - P=$(P), R=A0:AsynOut;P=$(P), R=A0:AsynIn;P=$(P), R=A0: - - - false;false;false - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - More - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 415 - 400 - 36 - 15 - - - - - - - 729 - 83 - 100 - 20 - - - - $(P)$(IN)UINT16.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 108 - 100 - 20 - - - - $(P)$(IN)BCD_UNSIGNED.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 133 - 100 - 20 - - - - $(P)$(IN)BCD_SIGNED.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 158 - 100 - 20 - - - - $(P)$(IN)INT16.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 183 - 100 - 20 - - - - $(P)$(IN)INT32_LE.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 208 - 100 - 20 - - - - $(P)$(IN)INT32_BE.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 233 - 100 - 20 - - - - $(P)$(IN)FLOAT32_LE.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 258 - 100 - 20 - - - - $(P)$(IN)FLOAT32_BE.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 283 - 100 - 20 - - - - $(P)$(IN)FLOAT64_LE.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 308 - 100 - 20 - - - - $(P)$(IN)FLOAT64_BE.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - - 729 - 333 - 100 - 20 - - - - $(P)$(IN)DEFAULT.SCAN - - - - 0 - 0 - 0 - - - - - 187 - 187 - 187 - - - - caMenu::Static - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Scan - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 744 - 59 - 70 - 20 - - - - - - - 489 - 86 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)UINT16 - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 111 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)BCD_UNSIGNED - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 136 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)BCD_SIGNED - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 161 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT16 - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 186 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT32_LE - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 211 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT32_BE - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 236 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT32_LE - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 261 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT32_BE - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 286 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT64_LE - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 311 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT64_BE - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - - 489 - 336 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)DEFAULT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Static - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - $(IREC) - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 491 - 59 - 84 - 20 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - $(OREC) - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 249 - 59 - 84 - 20 - - - - - - - 244 - 83 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)UINT16 - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 108 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)BCD_UNSIGNED - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 133 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)BCD_SIGNED - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 158 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT16 - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 183 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT32_LE - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 208 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT32_BE - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 233 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT32_LE - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 258 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT32_BE - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 283 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT64_LE - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 308 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT64_BE - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 244 - 333 - 80 - 20 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)DEFAULT - - - - 0 - 0 - 0 - - - - - 115 - 223 - 255 - - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - caLineEdit::Static - - - decimal - - - - - - 5 - 86 - 236 - 267 - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Unsigned 16-bit - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 99 - 0 - 135 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - BCD unsigned - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 126 - 25 - 108 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - BCD signed - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 144 - 50 - 90 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Signed 16-bit - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 117 - 75 - 117 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Default - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 171 - 250 - 63 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - 32-bit int little-endian - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 18 - 100 - 216 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - 32-bit int big-endian - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 45 - 125 - 216 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - 32-bit float little-endian - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 0 - 150 - 234 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - 32-bit float big-endian - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 27 - 175 - 234 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - 64-bit float little-endian - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 0 - 200 - 234 - 15 - - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - 64-bit float big-endian - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - - 27 - 225 - 234 - 15 - - - - - - - - 569 - 86 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)UINT16.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 111 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)BCD_UNSIGNED.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 136 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)BCD_SIGNED.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 161 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT16.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 186 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT32_LE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 211 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT32_BE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 236 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT32_LE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 261 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT32_BE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 286 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT64_LE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 311 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT64_BE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 569 - 336 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)DEFAULT.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Status - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 571 - 59 - 72 - 20 - - - - - - - 649 - 86 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)UINT16.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 111 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)BCD_UNSIGNED.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 136 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)BCD_SIGNED.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 161 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT16.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 186 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT32_LE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 211 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)INT32_BE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 236 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT32_LE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 261 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT32_BE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 286 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT64_LE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 311 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)FLOAT64_BE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 649 - 336 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(IN)DEFAULT.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Severity - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 651 - 59 - 96 - 20 - - - - - - - 329 - 59 - 157 - 294 - - - - - - 0 - 27 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)UINT16.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 52 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)BCD_UNSIGNED.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 77 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)BCD_SIGNED.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 102 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT16.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 127 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT32_LE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 152 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT32_BE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 177 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT32_LE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 202 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT32_BE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 227 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT64_LE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 252 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT64_BE.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 0 - 277 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)DEFAULT.STAT - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Status - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 2 - 0 - 72 - 20 - - - - - - - 80 - 27 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)UINT16.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 52 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)BCD_UNSIGNED.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 77 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)BCD_SIGNED.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 102 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT16.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 127 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT32_LE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 152 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)INT32_BE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 177 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT32_LE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 202 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT32_BE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 227 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT64_LE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 252 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)FLOAT64_BE.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - - 80 - 277 - 75 - 15 - - - - caLineEdit::WidthAndHeight - - - $(P)$(OUT)DEFAULT.SEVR - - - - 42 - 99 - 228 - - - - - 218 - 218 - 218 - - - - Qt::AlignAbsolute|Qt::AlignRight|Qt::AlignVCenter - - - caLineEdit::Channel - - - caLineEdit::Channel - - - caLineEdit::Channel - - - 0.0 - - - 1.0 - - - decimal - - - caLineEdit::Alarm_Static - - - - - QFrame::NoFrame - - - - 0 - 0 - 0 - - - - - 0 - 0 - 0 - - - - Severity - - - ESimpleLabel::WidthAndHeight - - - Qt::AlignAbsolute|Qt::AlignHCenter|Qt::AlignVCenter - - - - 82 - 0 - 96 - 20 - - - - - caLabel_0 - caLabel_1 - caLabel_2 - caLabel_3 - caLabel_4 - caLabel_5 - caLabel_6 - caLabel_7 - caLabel_8 - caLabel_9 - caLabel_10 - caLabel_11 - caLabel_12 - caLabel_13 - caLabel_14 - caLabel_15 - caLabel_16 - caFrame_0 - caLabel_17 - caLabel_18 - caLabel_19 - caLabel_20 - caFrame_1 - caTextEntry_0 - caRelatedDisplay_0 - caMenu_0 - caMenu_1 - caMenu_2 - caMenu_3 - caMenu_4 - caMenu_5 - caMenu_6 - caMenu_7 - caMenu_8 - caMenu_9 - caMenu_10 - caLineEdit_0 - caLineEdit_1 - caLineEdit_2 - caLineEdit_3 - caLineEdit_4 - caLineEdit_5 - caLineEdit_6 - caLineEdit_7 - caLineEdit_8 - caLineEdit_9 - caLineEdit_10 - caTextEntry_1 - caTextEntry_2 - caTextEntry_3 - caTextEntry_4 - caTextEntry_5 - caTextEntry_6 - caTextEntry_7 - caTextEntry_8 - caTextEntry_9 - caTextEntry_10 - caTextEntry_11 - caLineEdit_11 - caLineEdit_12 - caLineEdit_13 - caLineEdit_14 - caLineEdit_15 - caLineEdit_16 - caLineEdit_17 - caLineEdit_18 - caLineEdit_19 - caLineEdit_20 - caLineEdit_21 - caLineEdit_22 - caLineEdit_23 - caLineEdit_24 - caLineEdit_25 - caLineEdit_26 - caLineEdit_27 - caLineEdit_28 - caLineEdit_29 - caLineEdit_30 - caLineEdit_31 - caLineEdit_32 - caLineEdit_33 - caLineEdit_34 - caLineEdit_35 - caLineEdit_36 - caLineEdit_37 - caLineEdit_38 - caLineEdit_39 - caLineEdit_40 - caLineEdit_41 - caLineEdit_42 - caLineEdit_43 - caLineEdit_44 - caLineEdit_45 - caLineEdit_46 - caLineEdit_47 - caLineEdit_48 - caLineEdit_49 - caLineEdit_50 - caLineEdit_51 - caLineEdit_52 - caLineEdit_53 - caLineEdit_54 - - - \ No newline at end of file diff --git a/modbusApp/src/Makefile b/modbusApp/src/Makefile index e0cd8cf..f20c67a 100644 --- a/modbusApp/src/Makefile +++ b/modbusApp/src/Makefile @@ -10,33 +10,39 @@ include $(TOP)/configure/CONFIG # Build an IOC support library # .dbd will be created from Include.dbd -DBD += modbus.dbd +DBD += modbusApp.dbd DBD += modbusSupport.dbd INC += drvModbusAsyn.h +INC += modbusInterpose.h +INC += modbus.h LIBRARY_IOC = modbus -LIB_SRCS += drvModbusAsyn.c +USR_CFLAGS += -DUSE_TYPED_RSET +USR_CPPFLAGS += -DUSE_TYPED_RSET + +LIB_SRCS += drvModbusAsyn.cpp LIB_SRCS += modbusInterpose.c LIB_SRCS += testModbusSyncIO.cpp LIB_LIBS += asyn LIB_LIBS += $(EPICS_BASE_IOC_LIBS) LIB_SYS_LIBS_WIN32 += ws2_32 -#=========================== - -#Note that the command line that builds the -#library $(LIBNAME) may be HUGE (>3kB) - #============================= # build an ioc application -PROD_IOC = modbusApp +PROD_IOC += modbusApp +modbusApp_DBD += base.dbd +modbusApp_DBD += asyn.dbd drvAsynIPPort.dbd drvAsynSerialPort.dbd +modbusApp_DBD += modbusSupport.dbd # _registerRecordDeviceDriver.cpp will be created from .dbd -PROD_SRCS_DEFAULT += modbus_registerRecordDeviceDriver.cpp modbusMain.cpp -PROD_SRCS_vxWorks += modbus_registerRecordDeviceDriver.cpp +modbusApp_SRCS_DEFAULT += modbusApp_registerRecordDeviceDriver.cpp modbusMain.cpp +modbusApp_SRCS_vxWorks += modbusApp_registerRecordDeviceDriver.cpp + +PROD_IOC += testClient +testClient_SRCS += testClient.cpp PROD_LIBS += modbus PROD_LIBS += asyn diff --git a/modbusApp/src/drvModbusAsyn.c b/modbusApp/src/drvModbusAsyn.c deleted file mode 100644 index 19b0044..0000000 --- a/modbusApp/src/drvModbusAsyn.c +++ /dev/null @@ -1,2609 +0,0 @@ -/*---------------------------------------------------------------------- - * file: drvModbusAsyn.c - *---------------------------------------------------------------------- - * EPICS asyn driver support for Modbus protocol communication with PLCs - * - * Mark Rivers, University of Chicago - * Original Date March 3, 2007 - * - * Based on the modtcp and plctcp code from Rolf Keitel of Triumf, with - * work from Ivan So at NSLS. - *----------------------------------------------------------------------- - * - */ - - -/* ANSI C includes */ -#include -#include -#include -#include - -/* EPICS includes */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* Asyn includes */ -#include "asynDriver.h" -#include "asynOctetSyncIO.h" -#include "asynCommonSyncIO.h" -#include "asynStandardInterfaces.h" - -#include "modbus.h" -#include "drvModbusAsyn.h" -#include - -/* Defined constants */ - -#define MAX_READ_WORDS 125 /* Modbus limit on number of words to read */ -#define MAX_WRITE_WORDS 123 /* Modbus limit on number of words to write */ -#define HISTOGRAM_LENGTH 200 /* Length of time histogram */ -#define MODBUS_READ_TIMEOUT 2.0 /* Timeout for asynOctetSyncIO->writeRead */ - /* Note: this value actually has no effect, the real - * timeout is set in modbusInterposeConfig */ - -#define WAGO_ID_STRING "Wago" /* If the plcName parameter to drvModbusAsynConfigure contains - * this substring then the driver will do the initial readback - * for write operations and the readback for read/modify/write - * operations at address plus 0x200. */ - -#define WAGO_OFFSET 0x200 /* The offset for readback operations on Wago devices */ - -/* MODBUS_READ_WRITE_MULTIPLE_REGISTERS (function 23) is not very common, and is problematic. - * It can use a different range of registers for reading and writing. - * We handle this by defining 2 new function codes. - * These will use MODBUS_READ_WRITE_MULTIPLE_REGISTERS - * but one is read-only and the other is write-only. - * Each EPICS modbus driver will use one or the other, and hence will behave like - * READ_INPUT_REGISTERS or WRITE_MULTIPLE_REGISTERS. */ -#define MODBUS_READ_INPUT_REGISTERS_F23 123 -#define MODBUS_WRITE_MULTIPLE_REGISTERS_F23 223 - - -/* Structures for drvUser interface */ - -typedef enum { - modbusDataCommand, - modbusReadCommand, - modbusEnableHistogramCommand, - modbusReadHistogramCommand, - modbusHistogramBinTimeCommand, - modbusHistogramTimeAxisCommand, - modbusPollDelayCommand, - modbusReadOKCommand, - modbusWriteOKCommand, - modbusIOErrorsCommand, - modbusLastIOTimeCommand, - modbusMaxIOTimeCommand -} modbusCommand; - -/* Note, this constant must match the number of enums in modbusCommand */ -#define MAX_MODBUS_COMMANDS 12 - -typedef struct { - modbusCommand command; - char *commandString; -} modbusCommandStruct; - -static modbusCommandStruct modbusCommands[MAX_MODBUS_COMMANDS] = { - {modbusDataCommand, MODBUS_DATA_STRING}, - {modbusReadCommand, MODBUS_READ_STRING}, - {modbusEnableHistogramCommand, MODBUS_ENABLE_HISTOGRAM_STRING}, - {modbusReadHistogramCommand, MODBUS_READ_HISTOGRAM_STRING}, - {modbusHistogramBinTimeCommand, MODBUS_HISTOGRAM_BIN_TIME_STRING}, - {modbusHistogramTimeAxisCommand, MODBUS_HISTOGRAM_TIME_AXIS_STRING}, - {modbusPollDelayCommand, MODBUS_POLL_DELAY_STRING}, - {modbusReadOKCommand, MODBUS_READ_OK_STRING}, - {modbusWriteOKCommand, MODBUS_WRITE_OK_STRING}, - {modbusIOErrorsCommand, MODBUS_IO_ERRORS_STRING}, - {modbusLastIOTimeCommand, MODBUS_LAST_IO_TIME_STRING}, - {modbusMaxIOTimeCommand, MODBUS_MAX_IO_TIME_STRING} -}; - -typedef struct { - modbusDataType_t dataType; - char *dataTypeString; -} modbusDataTypeStruct; - -static modbusDataTypeStruct modbusDataTypes[MAX_MODBUS_DATA_TYPES] = { - {dataTypeUInt16, MODBUS_UINT16_STRING}, - {dataTypeInt16SM, MODBUS_INT16_SM_STRING}, - {dataTypeBCDUnsigned, MODBUS_BCD_UNSIGNED_STRING}, - {dataTypeBCDSigned, MODBUS_BCD_SIGNED_STRING}, - {dataTypeInt16, MODBUS_INT16_STRING}, - {dataTypeInt32LE, MODBUS_INT32_LE_STRING}, - {dataTypeInt32BE, MODBUS_INT32_BE_STRING}, - {dataTypeFloat32LE, MODBUS_FLOAT32_LE_STRING}, - {dataTypeFloat32BE, MODBUS_FLOAT32_BE_STRING}, - {dataTypeFloat64LE, MODBUS_FLOAT64_LE_STRING}, - {dataTypeFloat64BE, MODBUS_FLOAT64_BE_STRING}, - {dataTypeStringHigh, MODBUS_STRING_HIGH_STRING}, - {dataTypeStringLow, MODBUS_STRING_LOW_STRING}, - {dataTypeStringHighLow, MODBUS_STRING_HIGH_LOW_STRING}, - {dataTypeStringLowHigh, MODBUS_STRING_LOW_HIGH_STRING}, -}; - - - -/* The structure for the drvModbus asyn port or "object" */ - -typedef struct modbusStr *PLC_ID; - -typedef struct modbusStr -{ - char *portName; /* asyn port name for this server */ - char *octetPortName; /* asyn port name for the asyn octet port */ - char *plcType; /* String describing PLC type */ - int isConnected; /* Connection status */ - int ioStatus; /* I/O error status */ - asynUser *pasynUserOctet; /* asynUser for asynOctet interface to asyn octet port */ - asynUser *pasynUserCommon; /* asynUser for asynCommon interface to asyn octet port */ - asynUser *pasynUserTrace; /* asynUser for asynTrace on this port */ - asynStandardInterfaces asynStdInterfaces; /* Structure for standard interfaces */ - int modbusSlave; /* Modbus slave address */ - int modbusFunction; /* Modbus function code */ - int modbusStartAddress; /* Modbus starting addess for this port */ - int modbusLength; /* Number of words or bits of Modbus data */ - int absoluteAddressing; /* Address from asyn are absolute, rather than relative to modbusStartAddress */ - modbusDataType_t dataType; /* Data type */ - epicsUInt16 *data; /* Memory buffer */ - char modbusRequest[MAX_MODBUS_FRAME_SIZE]; /* Modbus request message */ - char modbusReply[MAX_MODBUS_FRAME_SIZE]; /* Modbus reply message */ - double pollDelay; /* Delay for readPoller */ - epicsThreadId readPollerThreadId; - epicsEventId readPollerEventId; - int forceCallback; - int readOnceFunction; - int readOnceDone; - asynStatus prevIOStatus; - int readOK; /* Statistics */ - int writeOK; - int IOErrors; - int maxIOMsec; - int lastIOMsec; - epicsInt32 timeHistogram[HISTOGRAM_LENGTH]; /* Histogram of read-times */ - epicsInt32 histogramTimeAxis[HISTOGRAM_LENGTH]; /* Time axis of histogram of read-times */ - int enableHistogram; - int histogramMsPerBin; - int readbackOffset; /* Readback offset for Wago devices */ -} modbusStr_t; - - -/* Local variable declarations */ -static char *driver = "drvModbusAsyn"; /* String for asynPrint */ -static int modbusInitialized = 0; -static int modbusExiting = 0; - -/* Local function declarations */ - -/* These functions are in the asynCommon interface */ -static void asynReport (void *drvPvt, FILE *fp, int details); -static asynStatus asynConnect (void *drvPvt, asynUser *pasynUser); -static asynStatus asynDisconnect (void *drvPvt, asynUser *pasynUser); - -static asynStatus drvUserCreate (void *drvPvt, asynUser *pasynUser, - const char *drvInfo, - const char **pptypeName, size_t *psize); -static asynStatus drvUserGetType (void *drvPvt, asynUser *pasynUser, - const char **pptypeName, size_t *psize); -static asynStatus drvUserDestroy (void *drvPvt, asynUser *pasynUser); - -/* These functions are in the asynUInt32Digital interface */ -static asynStatus writeUInt32D (void *drvPvt, asynUser *pasynUser, - epicsUInt32 value, epicsUInt32 mask); -static asynStatus readUInt32D (void *drvPvt, asynUser *pasynUser, - epicsUInt32 *value, epicsUInt32 mask); -static asynStatus setInterrupt (void *drvPvt, asynUser *pasynUser, - epicsUInt32 mask, interruptReason reason); -static asynStatus clearInterrupt (void *drvPvt, asynUser *pasynUser, - epicsUInt32 mask); -static asynStatus getInterrupt (void *drvPvt, asynUser *pasynUser, - epicsUInt32 *mask, interruptReason reason); - -/* These functions are in the asynInt32 interface */ -static asynStatus writeInt32 (void *drvPvt, asynUser *pasynUser, - epicsInt32 value); -static asynStatus readInt32 (void *drvPvt, asynUser *pasynUser, - epicsInt32 *value); -static asynStatus getBounds (void *drvPvt, asynUser *pasynUser, - epicsInt32 *low, epicsInt32 *high); - -/* These functions are in the asynFloat64 interface */ -static asynStatus writeFloat64 (void *drvPvt, asynUser *pasynUser, - epicsFloat64 value); -static asynStatus readFloat64 (void *drvPvt, asynUser *pasynUser, - epicsFloat64 *value); - -/* These functions are in the asynInt32Array interface */ -static asynStatus readInt32Array (void *drvPvt, asynUser *pasynUser, - epicsInt32 *data, size_t maxChans, - size_t *nactual); -static asynStatus writeInt32Array (void *drvPvt, asynUser *pasynUser, - epicsInt32 *data, size_t maxChans); - -/* These functions are in the asynOctet interface */ -static asynStatus writeOctet (void *drvPvt, asynUser *pasynUser, - const char *value, size_t maxChars, - size_t *nActual); -static asynStatus readOctet (void *drvPvt, asynUser *pasynUser, - char *value, size_t maxChars, - size_t *nActual, int *eomReason); - -/* These functions are not in any of the asyn interfaces */ -static void readPoller(PLC_ID pPlc); -static modbusDataType_t getDataType(PLC_ID pPlc, asynUser *pasynUser); -static int checkOffset(PLC_ID pPlc, int offset); -static int checkModbusFunction(PLC_ID pPlc, int *modbusFunction); -static int doModbusIO(PLC_ID pPlc, int slave, int function, int start, - epicsUInt16 *data, int len); -static asynStatus readPlcInt (modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - epicsInt32 *value, int *bufferLen); -static asynStatus writePlcInt (modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - epicsInt32 value, epicsUInt16 *buffer, int *bufferLen); -static asynStatus readPlcFloat (modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - epicsFloat64 *value, int *bufferLen); -static asynStatus writePlcFloat (modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - epicsFloat64 value, epicsUInt16 *buffer, int *bufferLen); -static asynStatus readPlcString (modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - char *value, size_t maxChars, int *bufferLen); -static asynStatus writePlcString(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - const char *value, size_t maxChars, size_t *nActual, int *bufferLen); - - -/* asynCommon methods */ -static const struct asynCommon drvCommon = { - asynReport, - asynConnect, - asynDisconnect -}; - -/* asynDrvUser methods */ -static asynDrvUser drvUser = { - drvUserCreate, - drvUserGetType, - drvUserDestroy -}; - -/* asynUInt32Digital methods */ -static struct asynUInt32Digital drvUInt32D = { - writeUInt32D, - readUInt32D, - setInterrupt, - clearInterrupt, - getInterrupt, - NULL, - NULL -}; - -/* asynInt32 methods */ -static asynInt32 drvInt32 = { - writeInt32, - readInt32, - getBounds, - NULL, - NULL -}; -/* asynFloat64 methods */ -static asynFloat64 drvFloat64 = { - writeFloat64, - readFloat64, - NULL, - NULL -}; - -/* asynInt32Array methods */ -static asynInt32Array drvInt32Array = { - writeInt32Array, - readInt32Array, - NULL, - NULL -}; - -static asynOctet drvOctet = { - writeOctet, - readOctet, - NULL, /* flushOctet */ - NULL, /* registerInterruptUser */ - NULL, /* cancelInterruptUser */ - NULL, /* setInputEosOctet */ - NULL, /* getInputEosOctet */ - NULL, /* setOutputEosOctet */ - NULL /* getOutputEosOctet */ -}; - - - -/******************************************************************** -** global driver functions -********************************************************************* -*/ - -static void modbusExitCallback(void *pPvt) { - modbusExiting = 1; -} - -/* -** drvModbusAsynConfigure() - create and init an asyn port driver for a PLC -** -*/ - -int drvModbusAsynConfigure(char *portName, - char *octetPortName, - int modbusSlave, - int modbusFunction, - int modbusStartAddress, - int modbusLength, - modbusDataType_t dataType, - int pollMsec, - char *plcType) -{ - int status; - PLC_ID pPlc; - char readThreadName[100]; - int needReadThread=0; - int IOLength=0; - int maxLength=0; - - if (plcType == NULL) plcType = ""; - pPlc = callocMustSucceed(1, sizeof(*pPlc), "drvModbusAsynConfigure"); - pPlc->portName = epicsStrDup(portName); - pPlc->octetPortName = epicsStrDup(octetPortName); - pPlc->plcType = epicsStrDup(plcType); - pPlc->modbusSlave = modbusSlave; - pPlc->modbusFunction = modbusFunction; - pPlc->modbusStartAddress = modbusStartAddress; - pPlc->dataType = dataType; - if (modbusStartAddress == -1) { - pPlc->absoluteAddressing = 1; - } - pPlc->modbusLength = modbusLength; - pPlc->pollDelay = pollMsec/1000.; - pPlc->histogramMsPerBin = 1; - - /* Set readback offset for Wago devices for which the register readback address - * is different from the register write address */ - if (strstr(pPlc->plcType, WAGO_ID_STRING) != NULL) - pPlc->readbackOffset = WAGO_OFFSET; - - switch(pPlc->modbusFunction) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - IOLength = pPlc->modbusLength/16; - maxLength = MAX_READ_WORDS; - needReadThread = 1; - break; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - IOLength = pPlc->modbusLength; - maxLength = MAX_READ_WORDS; - needReadThread = 1; - break; - case MODBUS_WRITE_SINGLE_COIL: - case MODBUS_WRITE_MULTIPLE_COILS: - IOLength = pPlc->modbusLength/16; - maxLength = MAX_WRITE_WORDS; - pPlc->readOnceFunction = MODBUS_READ_COILS; - break; - case MODBUS_WRITE_SINGLE_REGISTER: - case MODBUS_WRITE_MULTIPLE_REGISTERS: - IOLength = pPlc->modbusLength; - maxLength = MAX_WRITE_WORDS; - pPlc->readOnceFunction = MODBUS_READ_HOLDING_REGISTERS; - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - IOLength = pPlc->modbusLength; - maxLength = MAX_WRITE_WORDS; - pPlc->readOnceFunction = MODBUS_READ_INPUT_REGISTERS_F23; - break; - default: - errlogPrintf("%s::drvModbusAsynConfig port %s unsupported" - " Modbus function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - - /* If we are using absolute addressing then don't start read thread */ - if (pPlc->absoluteAddressing) needReadThread = 0; - - /* Make sure memory length is valid. */ - if (pPlc->modbusLength <= 0) { - errlogPrintf("%s::drvModbusConfigure, port %s" - " memory length<=0\n", - driver, pPlc->portName); - return asynError; - } - if (IOLength > maxLength) { - errlogPrintf("%s::drvModbusConfigure, port %s" - " memory length=%d too large, max=%d\n", - driver, pPlc->portName, IOLength, maxLength); - return asynError; - } - - /* Note that we always allocate modbusLength words of memory. - * This is needed even for write operations because we need a buffer to convert - * data for asynInt32Array writes. */ - pPlc->data = callocMustSucceed(pPlc->modbusLength, sizeof(epicsUInt16), - "drvModbusAsynConfigure"); - - /* Connect to asyn octet port with asynOctetSyncIO */ - status = pasynOctetSyncIO->connect(octetPortName, 0, &pPlc->pasynUserOctet, 0); - if (status != asynSuccess) { - errlogPrintf("%s::drvModbusAsynConfigure port %s" - " can't connect to asynOctet on Octet server %s.\n", - driver, portName, octetPortName); - return asynError; - } - - /* Connect to asyn octet port with asynCommonSyncIO */ - status = pasynCommonSyncIO->connect(octetPortName, 0, &pPlc->pasynUserCommon, 0); - if (status != asynSuccess) { - errlogPrintf("%s::drvModbusAsynConfigure port %s" - " can't connect to asynCommon on Octet server %s.\n", - driver, portName, octetPortName); - return asynError; - } - - /* Create asynUser for asynTrace */ - pPlc->pasynUserTrace = pasynManager->createAsynUser(0, 0); - pPlc->pasynUserTrace->userPvt = pPlc; - - status = pasynManager->registerPort(pPlc->portName, - ASYN_MULTIDEVICE | ASYN_CANBLOCK, - 1, /* autoconnect */ - 0, /* medium priority */ - 0); /* default stack size */ - if (status != asynSuccess) { - errlogPrintf("%s::drvModbusAsynConfigure port %s" - " can't register port\n", - driver, pPlc->portName); - return asynError; - } - - /* Create asyn interfaces and register with asynManager */ - pPlc->asynStdInterfaces.common.pinterface = (void *)&drvCommon; - pPlc->asynStdInterfaces.drvUser.pinterface = (void *)&drvUser; - pPlc->asynStdInterfaces.uInt32Digital.pinterface = (void *)&drvUInt32D; - pPlc->asynStdInterfaces.int32.pinterface = (void *)&drvInt32; - pPlc->asynStdInterfaces.float64.pinterface = (void *)&drvFloat64; - pPlc->asynStdInterfaces.int32Array.pinterface = (void *)&drvInt32Array; - pPlc->asynStdInterfaces.octet.pinterface = (void *)&drvOctet; - pPlc->asynStdInterfaces.uInt32DigitalCanInterrupt = 1; - pPlc->asynStdInterfaces.int32CanInterrupt = 1; - pPlc->asynStdInterfaces.float64CanInterrupt = 1; - pPlc->asynStdInterfaces.int32ArrayCanInterrupt = 1; - pPlc->asynStdInterfaces.octetCanInterrupt = 1; - - - status = pasynStandardInterfacesBase->initialize(pPlc->portName, &pPlc->asynStdInterfaces, - pPlc->pasynUserTrace, pPlc); - if (status != asynSuccess) { - errlogPrintf("%s::drvModbusAsynConfigure port %s" - " can't register standard interfaces: %s\n", - driver, pPlc->portName, pPlc->pasynUserTrace->errorMessage); - return asynError; - } - - /* Connect to device */ - status = pasynManager->connectDevice(pPlc->pasynUserTrace, pPlc->portName, 0); - if (status != asynSuccess) { - errlogPrintf("%s::drvModbusAsynConfigure port %s" - " connectDevice failed %s\n", - driver, pPlc->portName, pPlc->pasynUserTrace->errorMessage); - return asynError; - } - - /* If this is an output function do a readOnce operation if required. */ - if (pPlc->readOnceFunction && !pPlc->absoluteAddressing && (pPlc->pollDelay != 0)) { - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->readOnceFunction, - (pPlc->modbusStartAddress + pPlc->readbackOffset), - pPlc->data, pPlc->modbusLength); - if (status == asynSuccess) pPlc->readOnceDone = 1; - } - - /* Create the epicsEvent to wake up the readPoller. - * We do this even if there is no poller. */ - pPlc->readPollerEventId = epicsEventCreate(epicsEventEmpty); - - /* Create the thread to read registers if this is a read function code */ - if (needReadThread) { - epicsSnprintf(readThreadName, 100, "%sRead", pPlc->portName); - pPlc->readPollerThreadId = epicsThreadCreate(readThreadName, - epicsThreadPriorityMedium, - epicsThreadGetStackSize(epicsThreadStackSmall), - (EPICSTHREADFUNC)readPoller, - pPlc); - pPlc->forceCallback = 1; - } - - /* Register for epicsAtExit callback. Only need to do this once per IOC */ - if (!modbusInitialized) { - modbusInitialized = 1; - epicsAtExit(modbusExitCallback, pPlc); - } - return asynSuccess; -} - - -/* asynDrvUser routines */ -static asynStatus drvUserCreate(void *drvPvt, asynUser *pasynUser, - const char *drvInfo, - const char **pptypeName, size_t *psize) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - int i; - int offset; - char *pstring; - - /* We are passed a string that identifies this command. - * Set dataType and/or pasynUser->reason based on this string */ - - pasynUser->drvUser = &pPlc->dataType; - for (i=0; igetAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::drvUserCreate port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - pasynUser->drvUser = &modbusDataTypes[i].dataType; - pasynUser->reason = modbusDataCommand; - if (pptypeName) *pptypeName = epicsStrDup(MODBUS_DATA_STRING); - if (psize) *psize = sizeof(MODBUS_DATA_STRING); - asynPrint(pasynUser, ASYN_TRACE_FLOW, - "%s::drvUserCreate, port %s data type=%s\n", - driver, pPlc->portName, pstring); - return asynSuccess; - } - } - - for (i=0; ireason = modbusCommands[i].command; - if (pptypeName) *pptypeName = epicsStrDup(pstring); - if (psize) *psize = sizeof(modbusCommands[i].command); - asynPrint(pasynUser, ASYN_TRACE_FLOW, - "%s::drvUserCreate, port %s command=%s\n", - driver, pPlc->portName, pstring); - return asynSuccess; - } - } - asynPrint(pasynUser, ASYN_TRACE_ERROR, - "%s::drvUserCreate, port %s unknown command=%s\n", - driver, pPlc->portName, drvInfo); - return asynError; -} - -static asynStatus drvUserGetType(void *drvPvt, asynUser *pasynUser, - const char **pptypeName, size_t *psize) -{ - int command = pasynUser->reason; - - if (pptypeName) - *pptypeName = epicsStrDup(modbusCommands[command].commandString); - if (psize) *psize = sizeof(command); - return asynSuccess; -} - -static asynStatus drvUserDestroy(void *drvPvt, asynUser *pasynUser) -{ - return asynSuccess; -} - - -/***********************/ -/* asynCommon routines */ -/***********************/ - -/* Connect */ -static asynStatus asynConnect(void *drvPvt, asynUser *pasynUser) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - int offset; - - pasynManager->getAddr(pasynUser, &offset); - if (offset < -1) return asynError; - if (pPlc->absoluteAddressing) { - if (offset > 65535) return asynError; - } else { - if (offset >= pPlc->modbusLength) return asynError; - } - pasynManager->exceptionConnect(pasynUser); - return asynSuccess; -} - -/* Disconnect */ -static asynStatus asynDisconnect(void *drvPvt, asynUser *pasynUser) -{ - /* Does nothing for now. - * May be used if connection management is implemented */ - pasynManager->exceptionDisconnect(pasynUser); - return asynSuccess; -} - - -/* Report parameters */ -static void asynReport(void *drvPvt, FILE *fp, int details) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - - fprintf(fp, "modbus port: %s\n", pPlc->portName); - if (details) { - fprintf(fp, " asynOctet server: %s\n", pPlc->octetPortName); - fprintf(fp, " modbusSlave: %d\n", pPlc->modbusSlave); - fprintf(fp, " modbusFunction: %d\n", pPlc->modbusFunction); - fprintf(fp, " modbusStartAddress: 0%o\n", pPlc->modbusStartAddress); - fprintf(fp, " modbusLength: 0%o\n", pPlc->modbusLength); - fprintf(fp, " absoluteAddressing: %d\n", pPlc->absoluteAddressing); - fprintf(fp, " plcType: %s\n", pPlc->plcType); - fprintf(fp, " I/O errors: %d\n", pPlc->IOErrors); - fprintf(fp, " Read OK: %d\n", pPlc->readOK); - fprintf(fp, " Write OK: %d\n", pPlc->writeOK); - fprintf(fp, " pollDelay: %f\n", pPlc->pollDelay); - fprintf(fp, " Time for last I/O %d msec\n", pPlc->lastIOMsec); - fprintf(fp, " Max. I/O time: %d msec\n", pPlc->maxIOMsec); - fprintf(fp, " Time per hist. bin: %d msec\n", pPlc->histogramMsPerBin); - } - -} - - -/* -** asynUInt32D support -*/ -static asynStatus readUInt32D(void *drvPvt, asynUser *pasynUser, epicsUInt32 *value, - epicsUInt32 mask) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - int offset; - int modbusFunction; - - switch(pasynUser->reason) { - case modbusDataCommand: - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readUInt32D port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - if (pPlc->absoluteAddressing) { - /* If absolute addressing then there is no poller running */ - if (checkModbusFunction(pPlc, &modbusFunction)) return asynError; - pPlc->ioStatus = doModbusIO(pPlc, pPlc->modbusSlave, modbusFunction, - offset, pPlc->data, pPlc->modbusLength); - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - offset = 0; - pPlc->readOnceDone = 1; - } else { - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - } - *value = 0; - switch(pPlc->modbusFunction) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - *value = pPlc->data[offset]; - if ((mask != 0 ) && (mask != 0xFFFF)) *value &= mask; - break; - case MODBUS_WRITE_SINGLE_COIL: - case MODBUS_WRITE_MULTIPLE_COILS: - case MODBUS_WRITE_SINGLE_REGISTER: - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - if (!pPlc->readOnceDone) return asynError; - *value = pPlc->data[offset]; - if ((mask != 0 ) && (mask != 0xFFFF)) *value &= mask; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readUInt32D port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::readUInt32D port %s function=0x%x," - " offset=0%o, mask=0x%x, value=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction, - offset, mask, *value); - break; - case modbusEnableHistogramCommand: - *value = pPlc->enableHistogram; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeUInt32D port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - - return asynSuccess; -} - - -static asynStatus writeUInt32D(void *drvPvt, asynUser *pasynUser, epicsUInt32 value, - epicsUInt32 mask) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - int offset; - int modbusAddress; - int i; - epicsUInt16 data = value; - asynStatus status; - - switch(pasynUser->reason) { - case modbusDataCommand: - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeUInt32D port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - if (pPlc->absoluteAddressing) { - modbusAddress = offset; - } else { - modbusAddress = pPlc->modbusStartAddress + offset; - } - switch(pPlc->modbusFunction) { - case MODBUS_WRITE_SINGLE_COIL: - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, &data, 1); - if (status != asynSuccess) return(status); - break; - case MODBUS_WRITE_SINGLE_REGISTER: - /* Do this as a read/modify/write if mask is not all 0 or all 1 */ - if ((mask == 0) || (mask == 0xFFFF)) { - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, &data, 1); - } else { - status = doModbusIO(pPlc, pPlc->modbusSlave, MODBUS_READ_HOLDING_REGISTERS, - modbusAddress + pPlc->readbackOffset, &data, 1); - if (status != asynSuccess) return(status); - /* Set bits that are set in the value and set in the mask */ - data |= (value & mask); - /* Clear bits that are clear in the value and set in the mask */ - data &= (value | ~mask); - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, &data, 1); - } - if (status != asynSuccess) return(status); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeUInt32D port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::writeUInt32D port %s function=0x%x," - " address=0%o, mask=0x%x, value=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction, - modbusAddress, mask, data); - break; - case modbusEnableHistogramCommand: - if ((value != 0) && pPlc->enableHistogram == 0) { - /* We are turning on histogram enabling, erase existing data first */ - for (i=0; itimeHistogram[i] = 0; - } - } - pPlc->enableHistogram = value ? 1 : 0; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeUInt32D port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - - return asynSuccess; -} - - -/* setInterrupt, clearInterrupt, and getInterrupt are required by the asynUInt32Digital - * interface. - * They are used to control hardware interrupts for drivers that use them. - * They are not needed for Modbus, so we just return asynSuccess. */ - -static asynStatus setInterrupt (void *drvPvt, asynUser *pasynUser, epicsUInt32 mask, - interruptReason reason) -{ - return asynSuccess; -} - -static asynStatus clearInterrupt (void *drvPvt, asynUser *pasynUser, epicsUInt32 mask) -{ - return asynSuccess; -} - -static asynStatus getInterrupt (void *drvPvt, asynUser *pasynUser, epicsUInt32 *mask, - interruptReason reason) -{ - return asynSuccess; -} - - - -/* -** asynInt32 support -*/ - -static asynStatus readInt32 (void *drvPvt, asynUser *pasynUser, epicsInt32 *value) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int offset; - asynStatus status; - int bufferLen; - int modbusFunction; - - *value = 0; - - switch(pasynUser->reason) { - case modbusDataCommand: - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readInt32 port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - if (pPlc->absoluteAddressing) { - /* If absolute addressing then there is no poller running */ - if (checkModbusFunction(pPlc, &modbusFunction)) return asynError; - pPlc->ioStatus = doModbusIO(pPlc, pPlc->modbusSlave, modbusFunction, - offset, pPlc->data, pPlc->modbusLength); - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - offset = 0; - pPlc->readOnceDone = 1; - } else { - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - } - switch(pPlc->modbusFunction) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - *value = pPlc->data[offset]; - break; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - status = readPlcInt(pPlc, dataType, offset, value, &bufferLen); - if (status != asynSuccess) return status; - break; - case MODBUS_WRITE_SINGLE_COIL: - case MODBUS_WRITE_MULTIPLE_COILS: - if (!pPlc->readOnceDone) return asynError ; - *value = pPlc->data[offset]; - break; - case MODBUS_WRITE_SINGLE_REGISTER: - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - if (!pPlc->readOnceDone) return asynError; - status = readPlcInt(pPlc, dataType, offset, value, &bufferLen); - if (status != asynSuccess) return status; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readInt32 port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::readInt32 port %s function=0x%x," - " offset=0%o, value=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction, - offset, *value); - break; - case modbusReadCommand: - *value = 1; - break; - case modbusReadOKCommand: - *value = pPlc->readOK; - break; - case modbusWriteOKCommand: - *value = pPlc->writeOK; - break; - case modbusIOErrorsCommand: - *value = pPlc->IOErrors; - break; - case modbusLastIOTimeCommand: - *value = pPlc->lastIOMsec; - break; - case modbusMaxIOTimeCommand: - *value = pPlc->maxIOMsec; - break; - case modbusHistogramBinTimeCommand: - *value = pPlc->histogramMsPerBin; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readInt32 port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - - return asynSuccess; -} - - -static asynStatus writeInt32(void *drvPvt, asynUser *pasynUser, epicsInt32 value) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int offset; - int modbusAddress; - epicsUInt16 buffer[4]; - int bufferLen=0; - int i; - asynStatus status; - - - switch(pasynUser->reason) { - case modbusDataCommand: - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeInt32 port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - if (pPlc->absoluteAddressing) { - modbusAddress = offset; - offset = 0; - } else { - modbusAddress = pPlc->modbusStartAddress + offset; - } - switch(pPlc->modbusFunction) { - case MODBUS_WRITE_SINGLE_COIL: - buffer[0] = value; - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, buffer, 1); - if (status != asynSuccess) return(status); - break; - case MODBUS_WRITE_SINGLE_REGISTER: - status = writePlcInt(pPlc, dataType, offset, value, buffer, &bufferLen); - if (status != asynSuccess) return(status); - for (i=0; imodbusSlave, pPlc->modbusFunction, - modbusAddress+i, buffer+i, bufferLen); - } - if (status != asynSuccess) return(status); - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - status = writePlcInt(pPlc, dataType, offset, value, buffer, &bufferLen); - if (status != asynSuccess) return(status); - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, buffer, bufferLen); - if (status != asynSuccess) return(status); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeInt32 port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::writeInt32 port %s function=0x%x," - " modbusAddress=0%o, buffer[0]=0x%x, bufferLen=%d\n", - driver, pPlc->portName, pPlc->modbusFunction, - modbusAddress, buffer[0], bufferLen); - break; - case modbusReadCommand: - /* Read the data for this driver. This can be used when the poller is disabled. */ - epicsEventSignal(pPlc->readPollerEventId); - break; - case modbusHistogramBinTimeCommand: - /* Set the time per histogram bin in ms */ - pPlc->histogramMsPerBin = value; - if (pPlc->histogramMsPerBin < 1) pPlc->histogramMsPerBin = 1; - /* Since the time might have changed erase existing data */ - for (i=0; itimeHistogram[i] = 0; - pPlc->histogramTimeAxis[i] = i * pPlc->histogramMsPerBin; - } - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeInt32 port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - return asynSuccess; -} - - -/* This function should return the valid range for asynInt32 data. - * However, for Modbus devices there is no way for the driver to know what the - * valid range is, since the device could be an 8-bit unipolar ADC, 12-bit bipolar DAC, - * etc. Just return 0. - * It is up to device support to correctly interpret the numbers that are returned. */ - -static asynStatus getBounds (void *drvPvt, asynUser *pasynUser, - epicsInt32 *low, epicsInt32 *high) -{ - *high = 0; - *low = 0; - return asynSuccess; -} - - - -/* -** asynFloat64 support -*/ -static asynStatus readFloat64 (void *drvPvt, asynUser *pasynUser, epicsFloat64 *value) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int offset; - int bufferLen; - int modbusFunction; - asynStatus status = asynSuccess; - - *value = 0; - - switch(pasynUser->reason) { - case modbusDataCommand: - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readFloat64 port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - if (pPlc->absoluteAddressing) { - /* If absolute addressing then there is no poller running */ - if (checkModbusFunction(pPlc, &modbusFunction)) return asynError; - pPlc->ioStatus = doModbusIO(pPlc, pPlc->modbusSlave, modbusFunction, - offset, pPlc->data, pPlc->modbusLength); - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - offset = 0; - pPlc->readOnceDone = 1; - } else { - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - } - switch(pPlc->modbusFunction) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - *value = pPlc->data[offset]; - break; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - status = readPlcFloat(pPlc, dataType, offset, value, &bufferLen); - if (status != asynSuccess) return status; - break; - case MODBUS_WRITE_SINGLE_COIL: - case MODBUS_WRITE_MULTIPLE_COILS: - if (!pPlc->readOnceDone) return asynError; - *value = pPlc->data[offset]; - break; - case MODBUS_WRITE_SINGLE_REGISTER: - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - if (!pPlc->readOnceDone) return asynError; - status = readPlcFloat(pPlc, dataType, offset, value, &bufferLen); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readFloat64 port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::readFloat64 port %s function=0x%x," - " offset=0%o, value=%f, status=%d\n", - driver, pPlc->portName, pPlc->modbusFunction, - offset, *value, status); - break; - case modbusPollDelayCommand: - *value = pPlc->pollDelay; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readFloat64 port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - - return asynSuccess; -} - - -static asynStatus writeFloat64 (void *drvPvt, asynUser *pasynUser, epicsFloat64 value) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int offset; - int modbusAddress; - epicsUInt16 buffer[4]; - int bufferLen; - int i; - asynStatus status; - - - switch(pasynUser->reason) { - case modbusDataCommand: - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeFloat64 port %s invalid offset %d\n", - driver, pPlc->portName, offset); - return asynError; - } - if (pPlc->absoluteAddressing) { - modbusAddress = offset; - offset = 0; - } else { - modbusAddress = pPlc->modbusStartAddress + offset; - } - switch(pPlc->modbusFunction) { - case MODBUS_WRITE_SINGLE_COIL: - buffer[0] = (epicsUInt16)value; - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, buffer, 1); - if (status != asynSuccess) return(status); - break; - case MODBUS_WRITE_SINGLE_REGISTER: - status = writePlcFloat(pPlc, dataType, offset, value, buffer, &bufferLen); - for (i=0; imodbusSlave, pPlc->modbusFunction, - modbusAddress+i, buffer+i, 1); - if (status != asynSuccess) return(status); - } - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - status = writePlcFloat(pPlc, dataType, offset, value, buffer, &bufferLen); - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, buffer, bufferLen); - if (status != asynSuccess) return(status); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeFloat64 port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::writeFloat64 port %s function=0x%x," - " modbusAddress=0%o, buffer[0]=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction, - modbusAddress, buffer[0]); - break; - case modbusPollDelayCommand: - pPlc->pollDelay = value; - /* Send an event to the poller, because it might have a long poll time, or - * not be polling at all */ - epicsEventSignal(pPlc->readPollerEventId); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeFloat64 port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - return asynSuccess; -} - - - -/* -** asynInt32Array support -*/ -static asynStatus readInt32Array (void *drvPvt, asynUser *pasynUser, epicsInt32 *data, - size_t maxChans, size_t *nactual) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int offset; - int i; - int bufferLen; - int modbusFunction; - asynStatus status; - - *nactual = 0; - pasynManager->getAddr(pasynUser, &offset); - switch(pasynUser->reason) { - case modbusDataCommand: - if (pPlc->absoluteAddressing) { - /* If absolute addressing then there is no poller running */ - if (checkModbusFunction(pPlc, &modbusFunction)) return asynError; - pPlc->ioStatus = doModbusIO(pPlc, pPlc->modbusSlave, modbusFunction, - offset, pPlc->data, pPlc->modbusLength); - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - offset = 0; - } else { - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - } - switch(pPlc->modbusFunction) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - for (i=0; imodbusLength; i++) { - data[i] = pPlc->data[offset]; - offset++; - } - break; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - for (i=0; imodbusLength; i++) { - status = readPlcInt(pPlc, dataType, offset, &data[i], &bufferLen); - if (status) return status; - offset += bufferLen; - } - break; - - case MODBUS_WRITE_SINGLE_COIL: - case MODBUS_WRITE_MULTIPLE_COILS: - if (!pPlc->readOnceDone) return asynError; - for (i=0; imodbusLength; i++) { - data[i] = pPlc->data[offset]; - offset++; - } - break; - case MODBUS_WRITE_SINGLE_REGISTER: - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - if (!pPlc->readOnceDone) return asynError; - for (i=0; imodbusLength; i++) { - status = readPlcInt(pPlc, dataType, offset, &data[i], &bufferLen); - if (status) return status; - offset += bufferLen; - } - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readInt32 port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)pPlc->data, i*2, - "%s::readInt32Array port %s, function=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction); - break; - - case modbusReadHistogramCommand: - for (i=0; itimeHistogram[i]; - } - break; - - case modbusHistogramTimeAxisCommand: - for (i=0; ihistogramTimeAxis[i]; - } - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readInt32 port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - - *nactual = i; - return asynSuccess; -} - - -static asynStatus writeInt32Array (void *drvPvt, asynUser *pasynUser, epicsInt32 *data, - size_t maxChans) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int modbusAddress; - epicsUInt16 *dataAddress; - int nwrite=0; - int i; - int offset; - int outIndex; - int bufferLen; - asynStatus status; - - pasynManager->getAddr(pasynUser, &offset); - if (pPlc->absoluteAddressing) { - modbusAddress = offset; - dataAddress = pPlc->data; - outIndex = 0; - } else { - modbusAddress = pPlc->modbusStartAddress + offset; - dataAddress = pPlc->data + offset; - outIndex = offset; - } - switch(pasynUser->reason) { - case modbusDataCommand: - switch(pPlc->modbusFunction) { - case MODBUS_WRITE_MULTIPLE_COILS: - /* Need to copy data to local buffer to convert to epicsUInt16 */ - for (i=0; imodbusLength; i++) { - pPlc->data[outIndex] = data[i]; - outIndex++; - nwrite++; - } - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, dataAddress, nwrite); - if (status != asynSuccess) return(status); - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - for (i=0; imodbusLength; i++) { - status = writePlcInt(pPlc, dataType, outIndex, data[i], &pPlc->data[outIndex], &bufferLen); - if (status != asynSuccess) return(status); - outIndex += bufferLen; - nwrite += bufferLen; - } - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, dataAddress, nwrite); - if (status != asynSuccess) return(status); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeInt32Array port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)pPlc->data, i*2, - "%s::writeInt32Array port %s, function=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction); - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeInt32Array port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - return asynSuccess; -} - - -/* -** asynOctet support -*/ -static asynStatus readOctet (void *drvPvt, asynUser *pasynUser, char *data, - size_t maxChars, size_t *nactual, int *eomReason) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int offset; - int bufferLen; - int modbusFunction; - - *nactual = 0; - pasynManager->getAddr(pasynUser, &offset); - switch(pasynUser->reason) { - case modbusDataCommand: - if (pPlc->absoluteAddressing) { - /* If absolute addressing then there is no poller running */ - if (checkModbusFunction(pPlc, &modbusFunction)) return asynError; - pPlc->ioStatus = doModbusIO(pPlc, pPlc->modbusSlave, modbusFunction, - offset, pPlc->data, pPlc->modbusLength); - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - offset = 0; - } else { - if (pPlc->ioStatus != asynSuccess) return(pPlc->ioStatus); - } - switch(pPlc->modbusFunction) { - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - if (!pPlc->readOnceDone) return asynError; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - readPlcString(pPlc, dataType, offset, data, maxChars, &bufferLen); - *nactual = bufferLen; - *eomReason = ASYN_EOM_CNT; - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readInt32 port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)pPlc->data, *nactual, - "%s::readOctet port %s, function=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction); - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readOctet port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - - return asynSuccess; -} - - -static asynStatus writeOctet (void *drvPvt, asynUser *pasynUser, const char *data, size_t maxChars, size_t *nActual) -{ - PLC_ID pPlc = (PLC_ID)drvPvt; - modbusDataType_t dataType = getDataType(pPlc, pasynUser); - int modbusAddress; - epicsUInt16 *dataAddress; - int offset; - int bufferLen; - asynStatus status; - - pasynManager->getAddr(pasynUser, &offset); - if (pPlc->absoluteAddressing) { - modbusAddress = offset; - dataAddress = pPlc->data; - } else { - modbusAddress = pPlc->modbusStartAddress + offset; - dataAddress = pPlc->data + offset; - } - switch(pasynUser->reason) { - case modbusDataCommand: - switch(pPlc->modbusFunction) { - case MODBUS_WRITE_MULTIPLE_REGISTERS: - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - writePlcString(pPlc, dataType, offset, data, maxChars, nActual, &bufferLen); - if (bufferLen <= 0) break; - status = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - modbusAddress, dataAddress, bufferLen); - if (status != asynSuccess) return(status); - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeOctet port %s invalid request for Modbus" - " function %d\n", - driver, pPlc->portName, pPlc->modbusFunction); - return asynError; - } - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)pPlc->data, bufferLen*2, - "%s::writeOctet port %s, function=0x%x\n", - driver, pPlc->portName, pPlc->modbusFunction); - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writeInt32Array port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - return asynError; - } - return asynSuccess; -} - - -/* -**************************************************************************** -** Poller thread for port reads - One instance spawned per asyn port -**************************************************************************** -*/ - -static void readPoller(PLC_ID pPlc) -{ - - ELLLIST *pclientList; - interruptNode *pnode; - asynUInt32DigitalInterrupt *pUInt32D; - asynInt32Interrupt *pInt32; - asynFloat64Interrupt *pFloat64; - asynInt32ArrayInterrupt *pInt32Array; - asynOctetInterrupt *pOctet; - int offset; - int bufferLen; - int anyChanged; - asynStatus prevIOStatus=asynSuccess; - asynUser *pasynUser; - int i; - epicsUInt16 newValue, prevValue, mask; - epicsUInt32 uInt32Value; - epicsInt32 int32Value; - epicsFloat64 float64Value; - modbusDataType_t dataType; - char stringBuffer[MAX_READ_WORDS * 2]; - epicsUInt16 *prevData; /* Previous contents of memory buffer */ - epicsInt32 *int32Data; /* Buffer used for asynInt32Array callbacks */ - - prevData = callocMustSucceed(pPlc->modbusLength, sizeof(epicsUInt16), - "drvModbusAsyn::readPoller"); - int32Data = callocMustSucceed(pPlc->modbusLength, sizeof(epicsInt32), - "drvModbusAsyn::readPoller"); - - pasynManager->lockPort(pPlc->pasynUserTrace); - - /* Loop forever */ - while (1) - { - /* Sleep for the poll delay or waiting for epicsEvent with the port unlocked */ - pasynManager->unlockPort(pPlc->pasynUserTrace); - if (pPlc->pollDelay > 0.0) { - epicsEventWaitWithTimeout(pPlc->readPollerEventId, pPlc->pollDelay); - } else { - epicsEventWait(pPlc->readPollerEventId); - } - - if (modbusExiting) break; - - /* Lock the port. It is important that the port be locked so other threads cannot access the pPlc - * structure while the poller thread is running. */ - pasynManager->lockPort(pPlc->pasynUserTrace); - - /* Read the data */ - pPlc->ioStatus = doModbusIO(pPlc, pPlc->modbusSlave, pPlc->modbusFunction, - pPlc->modbusStartAddress, pPlc->data, pPlc->modbusLength); - /* If we have an I/O error this time and the previous time, just try again */ - if (pPlc->ioStatus != asynSuccess && - pPlc->ioStatus == prevIOStatus) { - epicsThreadSleep(1.0); - continue; - } - - /* If the I/O status has changed then force callbacks */ - if (pPlc->ioStatus != prevIOStatus) pPlc->forceCallback = 1; - - /* See if any memory location has actually changed. - * If not, no need to do callbacks. */ - anyChanged = memcmp(pPlc->data, prevData, - pPlc->modbusLength*sizeof(epicsUInt16)); - - /* Don't start polling until EPICS interruptAccept flag is set, - * because it does callbacks to device support. */ - while (!interruptAccept) { - pasynManager->unlockPort(pPlc->pasynUserTrace); - epicsThreadSleep(0.1); - pasynManager->lockPort(pPlc->pasynUserTrace); - } - - /* Process callbacks to device support. */ - - /* See if there are any asynUInt32Digital callbacks registered to be called - * when data changes. These callbacks only happen if the value has changed */ - if (pPlc->forceCallback || anyChanged){ - pasynManager->interruptStart(pPlc->asynStdInterfaces.uInt32DigitalInterruptPvt, &pclientList); - pnode = (interruptNode *)ellFirst(pclientList); - while (pnode) { - pUInt32D = pnode->drvPvt; - pasynUser = pUInt32D->pasynUser; - if (pasynUser->reason != modbusDataCommand) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - break; - } - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid offset %d, max=%d\n", - driver, pPlc->portName, offset, pPlc->modbusLength); - break; - } - mask = pUInt32D->mask; - newValue = pPlc->data[offset]; - if ((mask != 0 ) && (mask != 0xFFFF)) newValue &= mask; - prevValue = prevData[offset]; - if ((mask != 0 ) && (mask != 0xFFFF)) prevValue &= mask; - /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ - pasynUser->auxStatus = pPlc->ioStatus; - if (pPlc->forceCallback || (newValue != prevValue)) { - uInt32Value = newValue; - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::readPoller, calling client %p" - " mask=0x%x, callback=%p, data=0x%x\n", - driver, pUInt32D, pUInt32D->mask, pUInt32D->callback, uInt32Value); - pUInt32D->callback(pUInt32D->userPvt, pasynUser, uInt32Value); - } - pnode = (interruptNode *)ellNext(&pnode->node); - } - pasynManager->interruptEnd(pPlc->asynStdInterfaces.uInt32DigitalInterruptPvt); - } - - /* See if there are any asynInt32 callbacks registered to be called. - * These are called even if the data has not changed, because we could be doing - * ADC averaging */ - pasynManager->interruptStart(pPlc->asynStdInterfaces.int32InterruptPvt, &pclientList); - pnode = (interruptNode *)ellFirst(pclientList); - while (pnode) { - pInt32 = pnode->drvPvt; - pasynUser = pInt32->pasynUser; - if (pasynUser->reason != modbusDataCommand) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - break; - } - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid memory request %d, max=%d\n", - driver, pPlc->portName, offset, pPlc->modbusLength); - break; - } - dataType = getDataType(pPlc, pasynUser); - readPlcInt(pPlc, dataType, offset, &int32Value, &bufferLen); - /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ - pasynUser->auxStatus = pPlc->ioStatus; - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::readPoller, calling client %p" - "callback=%p, data=0x%x\n", - driver, pInt32, pInt32->callback, int32Value); - pInt32->callback(pInt32->userPvt, pasynUser, - int32Value); - pnode = (interruptNode *)ellNext(&pnode->node); - } - pasynManager->interruptEnd(pPlc->asynStdInterfaces.int32InterruptPvt); - - /* See if there are any asynFloat64 callbacks registered to be called. - * These are called even if the data has not changed, because we could be doing - * ADC averaging */ - pasynManager->interruptStart(pPlc->asynStdInterfaces.float64InterruptPvt, &pclientList); - pnode = (interruptNode *)ellFirst(pclientList); - while (pnode) { - pFloat64 = pnode->drvPvt; - pasynUser = pFloat64->pasynUser; - if (pasynUser->reason != modbusDataCommand) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - break; - } - pasynManager->getAddr(pasynUser, &offset); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid memory request %d, max=%d\n", - driver, pPlc->portName, offset, pPlc->modbusLength); - break; - } - dataType = getDataType(pPlc, pasynUser); - readPlcFloat(pPlc, dataType, offset, &float64Value, &bufferLen); - /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ - pFloat64->pasynUser->auxStatus = pPlc->ioStatus; - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::readPoller, calling client %p" - "callback=%p, data=%f\n", - driver, pFloat64, pFloat64->callback, float64Value); - pFloat64->callback(pFloat64->userPvt, pasynUser, - float64Value); - pnode = (interruptNode *)ellNext(&pnode->node); - } - pasynManager->interruptEnd(pPlc->asynStdInterfaces.float64InterruptPvt); - - - /* See if there are any asynInt32Array callbacks registered to be called. - * These are only called when data changes */ - if (pPlc->forceCallback || anyChanged){ - pasynManager->interruptStart(pPlc->asynStdInterfaces.int32ArrayInterruptPvt, &pclientList); - pnode = (interruptNode *)ellFirst(pclientList); - while (pnode) { - pInt32Array = pnode->drvPvt; - pasynUser = pInt32Array->pasynUser; - if (pasynUser->reason != modbusDataCommand) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - break; - } - /* Need to copy data to epicsInt32 buffer for callback */ - pasynManager->getAddr(pasynUser, &offset); - dataType = getDataType(pPlc, pasynUser); - for (i=0; imodbusLength && offset < pPlc->modbusLength; i++) { - readPlcInt(pPlc, dataType, offset, &int32Data[i], &bufferLen); - offset += bufferLen; - } - /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ - pasynUser->auxStatus = pPlc->ioStatus; - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::readPoller, calling client %p" - "callback=%p\n", - driver, pInt32Array, pInt32Array->callback); - pInt32Array->callback(pInt32Array->userPvt, pasynUser, - int32Data, i); - pnode = (interruptNode *)ellNext(&pnode->node); - } - pasynManager->interruptEnd(pPlc->asynStdInterfaces.int32ArrayInterruptPvt); - } - - /* See if there are any asynOctet callbacks registered to be called - * when data changes. These callbacks only happen if any data in this port has changed */ - if (pPlc->forceCallback || anyChanged){ - pasynManager->interruptStart(pPlc->asynStdInterfaces.octetInterruptPvt, &pclientList); - pnode = (interruptNode *)ellFirst(pclientList); - while (pnode) { - pOctet = pnode->drvPvt; - pasynUser = pOctet->pasynUser; - if (pasynUser->reason != modbusDataCommand) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid pasynUser->reason %d\n", - driver, pPlc->portName, pasynUser->reason); - break; - } - pasynManager->getAddr(pasynUser, &offset); - dataType = getDataType(pPlc, pasynUser); - if (checkOffset(pPlc, offset)) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPoller port %s invalid offset %d, max=%d\n", - driver, pPlc->portName, offset, pPlc->modbusLength); - break; - } - readPlcString(pPlc, dataType, offset, stringBuffer, sizeof(stringBuffer), &bufferLen); - /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ - pasynUser->auxStatus = pPlc->ioStatus; - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::readPoller, calling client %p" - " callback=%p, data=%s\n", - driver, pOctet, pOctet->callback, stringBuffer); - pOctet->callback(pOctet->userPvt, pasynUser, stringBuffer, bufferLen, ASYN_EOM_CNT); - pnode = (interruptNode *)ellNext(&pnode->node); - } - pasynManager->interruptEnd(pPlc->asynStdInterfaces.octetInterruptPvt); - } - - /* Reset the forceCallback flag */ - pPlc->forceCallback = 0; - - /* Set the previous I/O status */ - prevIOStatus = pPlc->ioStatus; - - /* Copy the new data to the previous data */ - memcpy(prevData, pPlc->data, pPlc->modbusLength*sizeof(epicsUInt16)); - } -} - - - -static int doModbusIO(PLC_ID pPlc, int slave, int function, int start, - epicsUInt16 *data, int len) -{ - modbusReadRequest *readReq; - modbusReadResponse *readResp; - modbusWriteSingleRequest *writeSingleReq; - /* modbusWriteSingleResponse *writeSingleResp; */ - modbusWriteMultipleRequest *writeMultipleReq; - /* modbusWriteMultipleResponse *writeMultipleResp; */ - modbusReadWriteMultipleRequest *readWriteMultipleReq; - modbusExceptionResponse *exceptionResp; - int requestSize=0; - int replySize; - unsigned char *pCharIn, *pCharOut; - epicsUInt16 *pShortIn, *pShortOut; - epicsUInt16 bitOutput; - int byteCount; - asynStatus status=asynSuccess; - int i; - epicsTimeStamp startTime, endTime; - size_t nwrite, nread; - int eomReason; - double dT; - int msec; - int bin; - unsigned char mask=0; - int autoConnect; - - /* If the Octet driver is not set for autoConnect then do connection management ourselves */ - status = pasynManager->isAutoConnect(pPlc->pasynUserOctet, &autoConnect); - if (!autoConnect) { - /* See if we are connected */ - status = pasynManager->isConnected(pPlc->pasynUserOctet, &pPlc->isConnected); - /* If we have an I/O error or are disconnected then disconnect device and reconnect */ - if ((pPlc->ioStatus != asynSuccess) || !pPlc->isConnected) { - if (pPlc->ioStatus != asynSuccess) - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s has I/O error\n", - driver, pPlc->portName); - if (!pPlc->isConnected) - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s is disconnected\n", - driver, pPlc->portName); - status = pasynCommonSyncIO->disconnectDevice(pPlc->pasynUserCommon); - if (status == asynSuccess) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::doModbusIO port %s disconnect device OK\n", - driver, pPlc->portName); - } else { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s disconnect error=%s\n", - driver, pPlc->portName, pPlc->pasynUserOctet->errorMessage); - } - status = pasynCommonSyncIO->connectDevice(pPlc->pasynUserCommon); - if (status == asynSuccess) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_FLOW, - "%s::doModbusIO port %s connect device OK\n", - driver, pPlc->portName); - } else { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s connect device error=%s\n", - driver, pPlc->portName, pPlc->pasynUserOctet->errorMessage); - goto done; - } - } - } - - switch (function) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - readReq = (modbusReadRequest *)pPlc->modbusRequest; - readReq->slave = slave; - readReq->fcode = function; - readReq->startReg = htons((epicsUInt16)start); - readReq->numRead = htons((epicsUInt16)len); - requestSize = sizeof(modbusReadRequest); - /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ - replySize = sizeof(modbusReadResponse) - 1 + len/8; - if (len % 8) replySize++; - break; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - readReq = (modbusReadRequest *)pPlc->modbusRequest; - readReq->slave = slave; - readReq->fcode = function; - readReq->startReg = htons((epicsUInt16)start); - readReq->numRead = htons((epicsUInt16)len); - requestSize = sizeof(modbusReadRequest); - /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ - replySize = sizeof(modbusReadResponse) - 1 + len*2; - break; - case MODBUS_READ_INPUT_REGISTERS_F23: - readWriteMultipleReq = (modbusReadWriteMultipleRequest *)pPlc->modbusRequest; - readWriteMultipleReq->slave = slave; - readWriteMultipleReq->fcode = MODBUS_READ_WRITE_MULTIPLE_REGISTERS; - readWriteMultipleReq->startReadReg = htons((epicsUInt16)start); - readWriteMultipleReq->numRead = htons((epicsUInt16)len); - readWriteMultipleReq->startWriteReg = htons((epicsUInt16)start); - /* It seems that one cannot specify numOutput=0 to not write values, at least the Modbus Slave - * simulator does not allow this. - * But nothing will be written if the data part of the message is 0 length. - * So we set numOutput to one word and set the message so the data length is 0. */ - readWriteMultipleReq->numOutput = htons(1); - readWriteMultipleReq->byteCount = 2; - /* The -1 below is because the modbusReadWriteMultipleRequest struct already has 1 byte of data, - and we don't want to send it. */ - requestSize = sizeof(modbusReadWriteMultipleRequest) - 1; - /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ - replySize = sizeof(modbusReadResponse) - 1 + len*2; - break; - case MODBUS_WRITE_SINGLE_COIL: - writeSingleReq = (modbusWriteSingleRequest *)pPlc->modbusRequest; - writeSingleReq->slave = slave; - writeSingleReq->fcode = function; - writeSingleReq->startReg = htons((epicsUInt16)start); - if (*data) bitOutput = 0xFF00; - else bitOutput = 0; - writeSingleReq->data = htons(bitOutput); - requestSize = sizeof(modbusWriteSingleRequest); - replySize = sizeof(modbusWriteSingleResponse); - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::doModbusIO port %s WRITE_SINGLE_COIL" - " address=0%o value=0x%x\n", - driver, pPlc->portName, start, bitOutput); - break; - case MODBUS_WRITE_SINGLE_REGISTER: - writeSingleReq = (modbusWriteSingleRequest *)pPlc->modbusRequest; - writeSingleReq->slave = slave; - writeSingleReq->fcode = function; - writeSingleReq->startReg = htons((epicsUInt16)start); - writeSingleReq->data = (epicsUInt16)*data; - writeSingleReq->data = htons(writeSingleReq->data); - requestSize = sizeof(modbusWriteSingleRequest); - replySize = sizeof(modbusWriteSingleResponse); - asynPrint(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - "%s::doModbusIO port %s WRITE_SINGLE_REGISTER" - " address=0%o value=0x%x\n", - driver, pPlc->portName, start, *data); - break; - case MODBUS_WRITE_MULTIPLE_COILS: - writeMultipleReq = (modbusWriteMultipleRequest *)pPlc->modbusRequest; - writeMultipleReq->slave = slave; - writeMultipleReq->fcode = function; - writeMultipleReq->startReg = htons((epicsUInt16)start); - /* Pack bits into output */ - pShortIn = (epicsUInt16 *)data; - pCharOut = (unsigned char *)&writeMultipleReq->data; - /* Subtract 1 because it will be incremented first time */ - pCharOut--; - for (i=0; inumOutput = htons(len); - byteCount = pCharOut - writeMultipleReq->data + 1; - writeMultipleReq->byteCount = byteCount; - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)writeMultipleReq->data, byteCount, - "%s::doModbusIO port %s WRITE_MULTIPLE_COILS\n", - driver, pPlc->portName); - requestSize = sizeof(modbusWriteMultipleRequest) + byteCount - 1; - replySize = sizeof(modbusWriteMultipleResponse); - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS: - writeMultipleReq = (modbusWriteMultipleRequest *)pPlc->modbusRequest; - writeMultipleReq->slave = slave; - writeMultipleReq->fcode = function; - writeMultipleReq->startReg = htons((epicsUInt16)start); - pShortIn = (epicsUInt16 *)data; - pShortOut = (epicsUInt16 *)&writeMultipleReq->data; - for (i=0; inumOutput = htons(len); - byteCount = 2*len; - writeMultipleReq->byteCount = byteCount; - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)writeMultipleReq->data, byteCount, - "%s::doModbusIO port %s WRITE_MULTIPLE_REGISTERS\n", - driver, pPlc->portName); - requestSize = sizeof(modbusWriteMultipleRequest) + byteCount - 1; - replySize = sizeof(modbusWriteMultipleResponse); - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - readWriteMultipleReq = (modbusReadWriteMultipleRequest *)pPlc->modbusRequest; - readWriteMultipleReq->slave = slave; - readWriteMultipleReq->fcode = MODBUS_READ_WRITE_MULTIPLE_REGISTERS; - readWriteMultipleReq->startReadReg = htons((epicsUInt16)start); - /* We don't actually do anything with the values read from the device, but it does not - * seem to be allowed to specify numRead=0, so we always read one word from the same address - * we write to. */ - nread = 1; - readWriteMultipleReq->numRead = htons(nread); - readWriteMultipleReq->startWriteReg = htons((epicsUInt16)start); - pShortIn = (epicsUInt16 *)data; - pShortOut = (epicsUInt16 *)&readWriteMultipleReq->data; - for (i=0; inumOutput = htons(len); - byteCount = 2*len; - readWriteMultipleReq->byteCount = byteCount; - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)readWriteMultipleReq->data, byteCount, - "%s::doModbusIO port %s WRITE_MULTIPLE_REGISTERS_F23\n", - driver, pPlc->portName); - requestSize = sizeof(modbusReadWriteMultipleRequest) + byteCount - 1; - /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ - replySize = sizeof(modbusReadResponse) + 2*nread - 1; - break; - - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO, port %s unsupported function code %d\n", - driver, pPlc->portName, function); - status = asynError; - goto done; - } - - /* Do the Modbus I/O as a write/read cycle */ - epicsTimeGetCurrent(&startTime); - status = pasynOctetSyncIO->writeRead(pPlc->pasynUserOctet, - pPlc->modbusRequest, requestSize, - pPlc->modbusReply, replySize, - MODBUS_READ_TIMEOUT, - &nwrite, &nread, &eomReason); - epicsTimeGetCurrent(&endTime); - - if (status != pPlc->prevIOStatus) { - if (status != asynSuccess) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s error calling writeRead," - " error=%s, nwrite=%d/%d, nread=%d\n", - driver, pPlc->portName, - pPlc->pasynUserOctet->errorMessage, (int)nwrite, requestSize, (int)nread); - } else { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s writeRead status back to normal" - " nwrite=%d/%d, nread=%d\n", - driver, pPlc->portName, - (int)nwrite, requestSize, (int)nread); - } - pPlc->prevIOStatus = status; - } - if (status != asynSuccess) { - pPlc->IOErrors++; - goto done; - } - - dT = epicsTimeDiffInSeconds(&endTime, &startTime); - msec = (int)(dT*1000. + 0.5); - pPlc->lastIOMsec = msec; - if (msec > pPlc->maxIOMsec) pPlc->maxIOMsec = msec; - if (pPlc->enableHistogram) { - bin = msec / pPlc->histogramMsPerBin; - if (bin < 0) bin = 0; - /* Longer times go in last bin of histogram */ - if (bin >= HISTOGRAM_LENGTH-1) bin = HISTOGRAM_LENGTH-1; - pPlc->timeHistogram[bin]++; - } - - /* See if there is a Modbus exception */ - readResp = (modbusReadResponse *)pPlc->modbusReply; - if (readResp->fcode & MODBUS_EXCEPTION_FCN) { - exceptionResp = (modbusExceptionResponse *)pPlc->modbusReply; - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO port %s Modbus exception=%d\n", - driver, pPlc->portName, exceptionResp->exception); - status = asynError; - goto done; - } - - /* Make sure the function code in the response is the same as the one - * in the request? */ - - switch (function) { - case MODBUS_READ_COILS: - case MODBUS_READ_DISCRETE_INPUTS: - pPlc->readOK++; - readResp = (modbusReadResponse *)pPlc->modbusReply; - nread = readResp->byteCount; - pCharIn = (unsigned char *)&readResp->data; - /* Subtract 1 because it will be incremented first time */ - pCharIn--; - /* We assume we got len bits back, since we are only told bytes */ - for (i=0; ipasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)data, len*2, - "%s::doModbusIO port %s READ_COILS\n", - driver, pPlc->portName); - break; - case MODBUS_READ_HOLDING_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS: - case MODBUS_READ_INPUT_REGISTERS_F23: - pPlc->readOK++; - readResp = (modbusReadResponse *)pPlc->modbusReply; - nread = readResp->byteCount/2; - pShortIn = (epicsUInt16 *)&readResp->data; - /* Check to make sure we got back the expected number of words */ - if (nread != len) { - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO, port %s expected %d words, actually received %d\n", - driver, pPlc->portName, len, (int)nread); - status = asynError; - goto done; - } - for (i=0; i<(int)nread; i++) { - data[i] = ntohs(pShortIn[i]); - } - asynPrintIO(pPlc->pasynUserTrace, ASYN_TRACEIO_DRIVER, - (char *)data, nread*2, - "%s::doModbusIO port %s READ_REGISTERS\n", - driver, pPlc->portName); - break; - - /* We don't do anything with responses to writes for now. - * Could add error checking. */ - case MODBUS_WRITE_SINGLE_COIL: - case MODBUS_WRITE_SINGLE_REGISTER: - pPlc->writeOK++; - /* Not using value for now so comment out to avoid compiler warning - writeSingleResp = (modbusWriteSingleResponse *)pPlc->modbusReply; - */ - break; - case MODBUS_WRITE_MULTIPLE_COILS: - case MODBUS_WRITE_MULTIPLE_REGISTERS: - pPlc->writeOK++; - /* Not using value for now so comment out to avoid compiler warning - writeMultipleResp = (modbusWriteMultipleResponse *)pPlc->modbusReply; - */ - break; - case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: - pPlc->writeOK++; - //readResp = (modbusReadResponse *)pPlc->modbusReply; - break; - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::doModbusIO, port %s unsupported function code %d\n", - driver, pPlc->portName, function); - status = asynError; - goto done; - } - - done: - return(status); -} - -modbusDataType_t getDataType(PLC_ID pPlc, asynUser *pasynUser) -{ - modbusDataType_t dataType; - if (pasynUser->drvUser) { - dataType = *(modbusDataType_t *)pasynUser->drvUser; - } else { - dataType = pPlc->dataType; - } - return dataType; -} - -int checkOffset(PLC_ID pPlc, int offset) -{ - if (offset < 0) return asynError; - if (pPlc->absoluteAddressing) { - if (offset > 65535) return asynError; - } else { - if (offset >= pPlc->modbusLength) return asynError; - } - return asynSuccess; -} - -int checkModbusFunction(PLC_ID pPlc, int *modbusFunction) -{ - /* If this is an initial read operation on a write function code and - * pollDelay is not > 0 then return error */ - if (pPlc->readOnceFunction && (pPlc->pollDelay <= 0)) return asynError; - *modbusFunction = pPlc->readOnceFunction ? pPlc->readOnceFunction : pPlc->modbusFunction; - return asynSuccess; -} - - - -asynStatus readPlcInt(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, epicsInt32 *output, int *bufferLen) -{ - epicsUInt16 value; - epicsInt32 result=0; - asynStatus status = asynSuccess; - epicsFloat64 fValue; - int i; - int mult=1; - int signMask = 0x8000; - int negative = 0; - int littleWord = (EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE) ? 0 : 1; - int bigWord = (EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE) ? 1 : 0; - union { - epicsInt32 int32; - epicsUInt16 uint16[2]; - } int16_32; - - value = pPlc->data[offset]; - *bufferLen = 1; - switch (dataType) { - case dataTypeUInt16: - result = value; - break; - - case dataTypeInt16SM: - result = value; - if (result & signMask) { - result &= ~signMask; - result = -(epicsInt16)result; - } - break; - - case dataTypeBCDSigned: - if (value & signMask) { - negative=1; - value &= ~signMask; - } /* Note: no break here! */ - case dataTypeBCDUnsigned: - for (i=0; i<4; i++) { - result += (value & 0xF)*mult; - mult = mult*10; - value = value >> 4; - } - if (negative) result = -result; - break; - - case dataTypeInt16: - result = (epicsInt16)value; - break; - - case dataTypeInt32LE: - int16_32.uint16[littleWord] = pPlc->data[offset]; - int16_32.uint16[bigWord] = pPlc->data[offset+1]; - result = int16_32.int32; - *bufferLen = 2; - break; - - case dataTypeInt32BE: - int16_32.uint16[bigWord] = pPlc->data[offset]; - int16_32.uint16[littleWord] = pPlc->data[offset+1]; - result = int16_32.int32; - *bufferLen = 2; - break; - - case dataTypeFloat32LE: - case dataTypeFloat32BE: - case dataTypeFloat64LE: - case dataTypeFloat64BE: - status = readPlcFloat(pPlc, dataType, offset, &fValue, bufferLen); - result = (epicsInt32)fValue; - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPlcInt, port %s unknown data type %d\n", - driver, pPlc->portName, dataType); - status = asynError; - } - *output = result; - return status; -} - - -asynStatus writePlcInt(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, epicsInt32 value, epicsUInt16 *buffer, int *bufferLen) -{ - epicsUInt16 result=0; - int i; - int signMask = 0x8000; - int div=1000; - int digit; - int negative = 0; - int littleWord = (EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE) ? 0 : 1; - int bigWord = (EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE) ? 1 : 0; - asynStatus status = asynSuccess; - union { - epicsInt32 int32; - epicsUInt16 uint16[2]; - } int16_32; - - *bufferLen = 1; - switch (dataType) { - case dataTypeUInt16: - buffer[0] = (epicsUInt16)value; - break; - - case dataTypeInt16SM: - result = value; - if (result & signMask) { - result = -(short)result; - result |= signMask; - } - buffer[0] = result; - break; - - case dataTypeBCDSigned: - if ((short)value < 0) { - negative=1; - value = -(short)value; - } /* Note: no break here */ - case dataTypeBCDUnsigned: - for (i=0; i<4; i++) { - result = result << 4; - digit = value / div; - result |= digit; - value = value - digit*div; - div = div/10; - } - if (negative) result |= signMask; - buffer[0] = result; - break; - - case dataTypeInt16: - buffer[0] = (epicsInt16)value; - break; - - case dataTypeInt32LE: - int16_32.int32 = value; - buffer[0] = int16_32.uint16[littleWord]; - buffer[1] = int16_32.uint16[bigWord]; - *bufferLen = 2; - break; - - case dataTypeInt32BE: - int16_32.int32 = value; - buffer[0] = int16_32.uint16[bigWord]; - buffer[1] = int16_32.uint16[littleWord]; - *bufferLen = 2; - break; - - case dataTypeFloat32LE: - case dataTypeFloat32BE: - case dataTypeFloat64LE: - case dataTypeFloat64BE: - status = writePlcFloat(pPlc, dataType, offset, (epicsFloat64)value, buffer, bufferLen); - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writePlcInt, port %s unknown data type %d\n", - driver, pPlc->portName, dataType); - status = asynError; - } - - return status; -} - -asynStatus readPlcFloat(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, epicsFloat64 *output, int *bufferLen) -{ - union { - epicsFloat32 f32; - epicsFloat64 f64; - epicsUInt16 ui16[4]; - } uIntFloat; - epicsInt32 iValue; - asynStatus status = asynSuccess; - /* Default to little-endian */ - int w32_0=0, w32_1=1, w64_0=0, w64_1=1, w64_2=2, w64_3=3; - if (EPICS_FLOAT_WORD_ORDER == EPICS_ENDIAN_BIG){ - w32_0=1; w32_1=0; w64_0=3; w64_1=2; w64_2=1; w64_3=0; - } - - switch (dataType) { - case dataTypeUInt16: - case dataTypeInt16SM: - case dataTypeBCDSigned: - case dataTypeBCDUnsigned: - case dataTypeInt16: - case dataTypeInt32LE: - case dataTypeInt32BE: - status = readPlcInt(pPlc, dataType, offset, &iValue, bufferLen); - *output = (epicsFloat64)iValue; - break; - - case dataTypeFloat32LE: - uIntFloat.ui16[w32_0] = pPlc->data[offset]; - uIntFloat.ui16[w32_1] = pPlc->data[offset+1]; - *output = (epicsFloat64)uIntFloat.f32; - *bufferLen = 2; - break; - - case dataTypeFloat32BE: - uIntFloat.ui16[w32_1] = pPlc->data[offset]; - uIntFloat.ui16[w32_0] = pPlc->data[offset+1]; - *output = (epicsFloat64)uIntFloat.f32; - *bufferLen = 2; - break; - - case dataTypeFloat64LE: - uIntFloat.ui16[w64_0] = pPlc->data[offset]; - uIntFloat.ui16[w64_1] = pPlc->data[offset+1]; - uIntFloat.ui16[w64_2] = pPlc->data[offset+2]; - uIntFloat.ui16[w64_3] = pPlc->data[offset+3]; - *output = (epicsFloat64)uIntFloat.f64; - *bufferLen = 4; - break; - - case dataTypeFloat64BE: - uIntFloat.ui16[w64_3] = pPlc->data[offset]; - uIntFloat.ui16[w64_2] = pPlc->data[offset+1]; - uIntFloat.ui16[w64_1] = pPlc->data[offset+2]; - uIntFloat.ui16[w64_0] = pPlc->data[offset+3]; - *output = (epicsFloat64)uIntFloat.f64; - *bufferLen = 4; - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPlcFloat, port %s unknown data type %d\n", - driver, pPlc->portName, dataType); - status = asynError; - } - return status; -} - - -asynStatus writePlcFloat(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, epicsFloat64 value, epicsUInt16 *buffer, int *bufferLen) -{ - union { - epicsFloat32 f32; - epicsFloat64 f64; - epicsUInt16 ui16[4]; - } uIntFloat; - asynStatus status = asynSuccess; - /* Default to little-endian */ - int w32_0=0, w32_1=1, w64_0=0, w64_1=1, w64_2=2, w64_3=3; - if (EPICS_FLOAT_WORD_ORDER == EPICS_ENDIAN_BIG){ - w32_0=1; w32_1=0; w64_0=3; w64_1=2; w64_2=1; w64_3=0; - } - - switch (dataType) { - case dataTypeUInt16: - case dataTypeInt16SM: - case dataTypeBCDSigned: - case dataTypeBCDUnsigned: - case dataTypeInt16: - case dataTypeInt32LE: - case dataTypeInt32BE: - status = writePlcInt(pPlc, dataType, offset, (epicsInt32)value, buffer, bufferLen); - break; - - case dataTypeFloat32LE: - *bufferLen = 2; - uIntFloat.f32 = (epicsFloat32)value; - buffer[0] = uIntFloat.ui16[w32_0]; - buffer[1] = uIntFloat.ui16[w32_1]; - break; - - case dataTypeFloat32BE: - *bufferLen = 2; - uIntFloat.f32 = (epicsFloat32)value; - buffer[0] = uIntFloat.ui16[w32_1]; - buffer[1] = uIntFloat.ui16[w32_0]; - break; - - case dataTypeFloat64LE: - *bufferLen = 4; - uIntFloat.f64 = value; - buffer[0] = uIntFloat.ui16[w64_0]; - buffer[1] = uIntFloat.ui16[w64_1]; - buffer[2] = uIntFloat.ui16[w64_2]; - buffer[3] = uIntFloat.ui16[w64_3]; - break; - - case dataTypeFloat64BE: - *bufferLen = 4; - uIntFloat.f64 = value; - buffer[0] = uIntFloat.ui16[w64_3]; - buffer[1] = uIntFloat.ui16[w64_2]; - buffer[2] = uIntFloat.ui16[w64_1]; - buffer[3] = uIntFloat.ui16[w64_0]; - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::writePlcFloat, port %s unsupported data type %d\n", - driver, pPlc->portName, dataType); - status = asynError; - } - return status; -} - -static asynStatus readPlcString(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - char *data, size_t maxChars, int *bufferLen) -{ - int i; - asynStatus status = asynSuccess; - - for (i=0; imodbusLength; i++, offset++) { - switch (dataType) { - case dataTypeStringHigh: - data[i] = (pPlc->data[offset] >> 8) & 0x00ff; - break; - - case dataTypeStringLow: - data[i] = pPlc->data[offset] & 0x00ff; - break; - - case dataTypeStringHighLow: - data[i] = (pPlc->data[offset] >> 8) & 0x00ff; - if (idata[offset] & 0x00ff; - } - break; - - case dataTypeStringLowHigh: - data[i] = pPlc->data[offset] & 0x00ff; - if (idata[offset] >> 8) & 0x00ff; - } - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPlcFloat, port %s unknown data type %d\n", - driver, pPlc->portName, dataType); - status = asynError; - } - } - /* Nil terminate and set number of characters to include trailing nil */ - if (i >= maxChars) { - i = maxChars-1; - } - data[i] = 0; - *bufferLen = strlen(data) + 1; - return status; -} - -static asynStatus writePlcString(modbusStr_t *pPlc, modbusDataType_t dataType, int offset, - const char *data, size_t maxChars, size_t *nActual, int *bufferLen) -{ - int i; - asynStatus status = asynSuccess; - - for (i=0, *bufferLen=0, *nActual=0; imodbusLength; i++, offset++) { - switch (dataType) { - case dataTypeStringHigh: - pPlc->data[offset] = (data[i] << 8) & 0xff00; - break; - - case dataTypeStringLow: - pPlc->data[offset] = data[i] & 0x00ff; - break; - - case dataTypeStringHighLow: - pPlc->data[offset] = (data[i] << 8) & 0xff00; - if (idata[offset] |= data[i] & 0x00ff; - } - break; - - case dataTypeStringLowHigh: - pPlc->data[offset] = data[i] & 0x00ff; - if (idata[offset] |= (data[i] << 8) & 0xff00; - } - break; - - default: - asynPrint(pPlc->pasynUserTrace, ASYN_TRACE_ERROR, - "%s::readPlcFloat, port %s unknown data type %d\n", - driver, pPlc->portName, dataType); - status = asynError; - } - *nActual = i + 1; - (*bufferLen)++; - } - return status; -} - - -/* iocsh functions */ - -static const iocshArg ConfigureArg0 = {"Port name", iocshArgString}; -static const iocshArg ConfigureArg1 = {"Octet port name", iocshArgString}; -static const iocshArg ConfigureArg2 = {"Modbus slave address", iocshArgInt}; -static const iocshArg ConfigureArg3 = {"Modbus function code", iocshArgInt}; -static const iocshArg ConfigureArg4 = {"Modbus start address", iocshArgInt}; -static const iocshArg ConfigureArg5 = {"Modbus length", iocshArgInt}; -static const iocshArg ConfigureArg6 = {"Data type (0=binary, 1=BCD)", iocshArgInt}; -static const iocshArg ConfigureArg7 = {"Poll time (msec)", iocshArgInt}; -static const iocshArg ConfigureArg8 = {"PLC type", iocshArgString}; - -static const iocshArg * const drvModbusAsynConfigureArgs[9] = { - &ConfigureArg0, - &ConfigureArg1, - &ConfigureArg2, - &ConfigureArg3, - &ConfigureArg4, - &ConfigureArg5, - &ConfigureArg6, - &ConfigureArg7, - &ConfigureArg8 -}; - -static const iocshFuncDef drvModbusAsynConfigureFuncDef= - {"drvModbusAsynConfigure", 9, - drvModbusAsynConfigureArgs}; -static void drvModbusAsynConfigureCallFunc(const iocshArgBuf *args) -{ - drvModbusAsynConfigure(args[0].sval, args[1].sval, args[2].ival, args[3].ival, args[4].ival, - args[5].ival, args[6].ival, args[7].ival, args[8].sval); -} - - -static void drvModbusAsynRegister(void) -{ - iocshRegister(&drvModbusAsynConfigureFuncDef,drvModbusAsynConfigureCallFunc); -} - -epicsExportRegistrar(drvModbusAsynRegister); diff --git a/modbusApp/src/drvModbusAsyn.cpp b/modbusApp/src/drvModbusAsyn.cpp new file mode 100644 index 0000000..30387ad --- /dev/null +++ b/modbusApp/src/drvModbusAsyn.cpp @@ -0,0 +1,2940 @@ +/*---------------------------------------------------------------------- + * file: drvModbusAsyn.cpp + *---------------------------------------------------------------------- + * EPICS asyn driver support for Modbus protocol communication with PLCs + * + * Mark Rivers, University of Chicago + * Original Date March 3, 2007 + * + * Based on the modtcp and plctcp code from Rolf Keitel of Triumf, with + * work from Ivan So at NSLS. + *----------------------------------------------------------------------- + * + */ + + +/* ANSI C includes */ +#include +#include +#include +#include + +/* EPICS includes */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Asyn includes */ +#include "asynPortDriver.h" +#include "asynOctetSyncIO.h" +#include "asynCommonSyncIO.h" + +#include +#include "modbus.h" +#include "drvModbusAsyn.h" + +/* Defined constants */ + +#define MAX_READ_WORDS 125 /* Modbus limit on number of words to read */ +#define MAX_WRITE_WORDS 123 /* Modbus limit on number of words to write */ +#define MODBUS_READ_TIMEOUT 2.0 /* Timeout for asynOctetSyncIO->writeRead */ + /* Note: this value actually has no effect, the real + * timeout is set in modbusInterposeConfig */ + +#define WAGO_ID_STRING "Wago" /* If the plcName parameter to drvModbusAsynConfigure contains + * this substring then the driver will do the initial readback + * for write operations and the readback for read/modify/write + * operations at address plus 0x200. */ + +#define WAGO_OFFSET 0x200 /* The offset for readback operations on Wago devices */ + +/* MODBUS_READ_WRITE_MULTIPLE_REGISTERS (function 23) is not very common, and is problematic. + * It can use a different range of registers for reading and writing. + * We handle this by defining 2 new function codes. + * These will use MODBUS_READ_WRITE_MULTIPLE_REGISTERS + * but one is read-only and the other is write-only. + * Each EPICS modbus driver will use one or the other, and hence will behave like + * READ_INPUT_REGISTERS or WRITE_MULTIPLE_REGISTERS. */ +#define MODBUS_READ_INPUT_REGISTERS_F23 123 +#define MODBUS_WRITE_MULTIPLE_REGISTERS_F23 223 + +typedef struct { + modbusDataType_t dataType; + const char *dataTypeString; +} modbusDataTypeStruct; + +struct modbusDrvUser_t { + modbusDataType_t dataType; + int len; +}; + +static modbusDataTypeStruct modbusDataTypes[MAX_MODBUS_DATA_TYPES] = { + {dataTypeInt16, MODBUS_INT16_STRING}, + {dataTypeInt16SM, MODBUS_INT16_SM_STRING}, + {dataTypeBCDUnsigned, MODBUS_BCD_UNSIGNED_STRING}, + {dataTypeBCDSigned, MODBUS_BCD_SIGNED_STRING}, + {dataTypeUInt16, MODBUS_UINT16_STRING}, + {dataTypeInt32LE, MODBUS_INT32_LE_STRING}, + {dataTypeInt32LEBS, MODBUS_INT32_LE_BS_STRING}, + {dataTypeInt32BE, MODBUS_INT32_BE_STRING}, + {dataTypeInt32BEBS, MODBUS_INT32_BE_BS_STRING}, + {dataTypeUInt32LE, MODBUS_UINT32_LE_STRING}, + {dataTypeUInt32LEBS, MODBUS_UINT32_LE_BS_STRING}, + {dataTypeUInt32BE, MODBUS_UINT32_BE_STRING}, + {dataTypeUInt32BEBS, MODBUS_UINT32_BE_BS_STRING}, + {dataTypeInt64LE, MODBUS_INT64_LE_STRING}, + {dataTypeInt64LEBS, MODBUS_INT64_LE_BS_STRING}, + {dataTypeInt64BE, MODBUS_INT64_BE_STRING}, + {dataTypeInt64BEBS, MODBUS_INT64_BE_BS_STRING}, + {dataTypeUInt64LE, MODBUS_UINT64_LE_STRING}, + {dataTypeUInt64LEBS, MODBUS_UINT64_LE_BS_STRING}, + {dataTypeUInt64BE, MODBUS_UINT64_BE_STRING}, + {dataTypeUInt64BEBS, MODBUS_UINT64_BE_BS_STRING}, + {dataTypeFloat32LE, MODBUS_FLOAT32_LE_STRING}, + {dataTypeFloat32LEBS, MODBUS_FLOAT32_LE_BS_STRING}, + {dataTypeFloat32BE, MODBUS_FLOAT32_BE_STRING}, + {dataTypeFloat32BEBS, MODBUS_FLOAT32_BE_BS_STRING}, + {dataTypeFloat64LE, MODBUS_FLOAT64_LE_STRING}, + {dataTypeFloat64LEBS, MODBUS_FLOAT64_LE_BS_STRING}, + {dataTypeFloat64BE, MODBUS_FLOAT64_BE_STRING}, + {dataTypeFloat64BEBS, MODBUS_FLOAT64_BE_BS_STRING}, + {dataTypeStringHigh, MODBUS_STRING_HIGH_STRING}, + {dataTypeStringLow, MODBUS_STRING_LOW_STRING}, + {dataTypeStringHighLow, MODBUS_STRING_HIGH_LOW_STRING}, + {dataTypeStringLowHigh, MODBUS_STRING_LOW_HIGH_STRING}, + {dataTypeZStringHigh, MODBUS_ZSTRING_HIGH_STRING}, + {dataTypeZStringLow, MODBUS_ZSTRING_LOW_STRING}, + {dataTypeZStringHighLow, MODBUS_ZSTRING_HIGH_LOW_STRING}, + {dataTypeZStringLowHigh, MODBUS_ZSTRING_LOW_HIGH_STRING}, +}; + +static EPICS_ALWAYS_INLINE epicsUInt16 bswap16(epicsUInt16 value) +{ + return (((epicsUInt16)(value) & 0x00ff) << 8) | + (((epicsUInt16)(value) & 0xff00) >> 8); +} + + +/* Local variable declarations */ +static const char *driverName = "drvModbusAsyn"; /* String for asynPrint */ + +static void readPollerC(void *drvPvt); + + +/******************************************************************** +** global driver functions +********************************************************************* +*/ + +static void modbusExitCallback(void *pPvt) { + drvModbusAsyn *pDriver = (drvModbusAsyn*)pPvt; + pDriver->modbusExiting_ = true; +} + +drvModbusAsyn::drvModbusAsyn(const char *portName, const char *octetPortName, + int modbusSlave, int modbusFunction, + int modbusStartAddress, int modbusLength, + modbusDataType_t dataType, + int pollMsec, + const char *plcType) + + : asynPortDriver(portName, + 1, /* maxAddr */ + asynInt32Mask | asynUInt32DigitalMask | asynInt64Mask | asynFloat64Mask | asynInt32ArrayMask | asynOctetMask | asynDrvUserMask, /* Interface mask */ + asynInt32Mask | asynUInt32DigitalMask | asynInt64Mask | asynFloat64Mask | asynInt32ArrayMask | asynOctetMask, /* Interrupt mask */ + ASYN_CANBLOCK | ASYN_MULTIDEVICE, /* asynFlags */ + 1, /* Autoconnect */ + 0, /* Default priority */ + 0), /* Default stack size*/ + + modbusExiting_(false), + initialized_(false), + octetPortName_(epicsStrDup(octetPortName)), + plcType_(NULL), + isConnected_(false), + ioStatus_(asynError), + prevIOStatus_(asynSuccess), + modbusSlave_(modbusSlave), + modbusFunction_(modbusFunction), + modbusStartAddress_(modbusStartAddress), + modbusLength_(modbusLength), + absoluteAddressing_(false), + dataType_(dataType), + drvUser_(NULL), + data_(0), + pollDelay_(pollMsec/1000.), + forceCallback_(false), + readOnceFunction_(0), + readOnceDone_(false), + readOK_(0), + writeOK_(0), + IOErrors_(0), + currentIOErrors_(0), + maxIOMsec_(0), + lastIOMsec_(0), + enableHistogram_(false), + histogramMsPerBin_(1), + readbackOffset_(0) + +{ + int status; + char readThreadName[100]; + int needReadThread=0; + int maxLength=0; + static const char *functionName="drvModbusAsyn"; + + if (plcType == NULL) plcType = ""; + plcType_ = epicsStrDup(plcType); + if (modbusStartAddress == -1) { + absoluteAddressing_ = true; + } + + /* Set readback offset for Wago devices for which the register readback address + * is different from the register write address */ + if (strstr(plcType_, WAGO_ID_STRING) != NULL) + readbackOffset_ = WAGO_OFFSET; + + createParam(MODBUS_DATA_STRING, asynParamInt32, &P_Data); + createParam(MODBUS_READ_STRING, asynParamInt32, &P_Read); + createParam(MODBUS_ENABLE_HISTOGRAM_STRING, asynParamUInt32Digital, &P_EnableHistogram); + createParam(MODBUS_READ_HISTOGRAM_STRING, asynParamInt32, &P_ReadHistogram); + createParam(MODBUS_HISTOGRAM_BIN_TIME_STRING, asynParamInt32, &P_HistogramBinTime); + createParam(MODBUS_HISTOGRAM_TIME_AXIS_STRING, asynParamInt32Array, &P_HistogramTimeAxis); + createParam(MODBUS_POLL_DELAY_STRING, asynParamFloat64, &P_PollDelay); + createParam(MODBUS_READ_OK_STRING, asynParamInt32, &P_ReadOK); + createParam(MODBUS_WRITE_OK_STRING, asynParamInt32, &P_WriteOK); + createParam(MODBUS_IO_ERRORS_STRING, asynParamInt32, &P_IOErrors); + createParam(MODBUS_LAST_IO_TIME_STRING, asynParamInt32, &P_LastIOTime); + createParam(MODBUS_MAX_IO_TIME_STRING, asynParamInt32, &P_MaxIOTime); + + setIntegerParam(P_ReadOK, 0); + setIntegerParam(P_WriteOK, 0); + setIntegerParam(P_IOErrors, 0); + setIntegerParam(P_LastIOTime, 0); + setIntegerParam(P_MaxIOTime, 0); + + switch(modbusFunction_) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + maxLength = MAX_READ_WORDS * 16; + needReadThread = 1; + break; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + maxLength = MAX_READ_WORDS; + needReadThread = 1; + break; + case MODBUS_WRITE_SINGLE_COIL: + case MODBUS_WRITE_MULTIPLE_COILS: + maxLength = MAX_WRITE_WORDS * 16; + readOnceFunction_ = MODBUS_READ_COILS; + break; + case MODBUS_WRITE_SINGLE_REGISTER: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + maxLength = MAX_WRITE_WORDS; + readOnceFunction_ = MODBUS_READ_HOLDING_REGISTERS; + break; + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + maxLength = MAX_WRITE_WORDS; + readOnceFunction_ = MODBUS_READ_INPUT_REGISTERS_F23; + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s unsupported Modbus function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return; + } + + /* If we are using absolute addressing then don't start read thread */ + if (absoluteAddressing_) needReadThread = 0; + + /* Make sure memory length is valid. */ + if (modbusLength_ <= 0) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s memory length<=0\n", + driverName, functionName, this->portName); + return; + } + if (modbusLength_ > maxLength) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s memory length=%d too large, max=%d\n", + driverName, functionName, this->portName, modbusLength_, maxLength); + return; + } + + /* Note that we always allocate modbusLength words of memory. + * This is needed even for write operations because we need a buffer to convert + * data for asynInt32Array writes. */ + data_ = (epicsUInt16 *) callocMustSucceed(modbusLength_, sizeof(epicsUInt16), functionName); + + /* Allocate and initialize the default drvUser structure */ + drvUser_ = (modbusDrvUser_t *) callocMustSucceed(1, sizeof(modbusDrvUser_t), functionName); + drvUser_->dataType = dataType_; + drvUser_->len = -1; + + /* Connect to asyn octet port with asynOctetSyncIO */ + status = pasynOctetSyncIO->connect(octetPortName, 0, &pasynUserOctet_, 0); + if (status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s can't connect to asynOctet on Octet server %s.\n", + driverName, functionName, portName, octetPortName); + return; + } + + /* Connect to asyn octet port with asynCommonSyncIO */ + status = pasynCommonSyncIO->connect(octetPortName, 0, &pasynUserCommon_, 0); + if (status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s can't connect to asynCommon on Octet server %s.\n", + driverName, functionName, portName, octetPortName); + return; + } + + /* If this is an output function do a readOnce operation if required. */ + if (readOnceFunction_ && !absoluteAddressing_ && (pollDelay_ != 0)) { + ioStatus_ = doModbusIO(modbusSlave_, readOnceFunction_, + (modbusStartAddress_ + readbackOffset_), + data_, modbusLength_); + if (ioStatus_ == asynSuccess) readOnceDone_ = true; + } + + /* Create the epicsEvent to wake up the readPoller. + * We do this even if there is no poller. */ + readPollerEventId_ = epicsEventCreate(epicsEventEmpty); + + /* Create the thread to read registers if this is a read function code */ + if (needReadThread) { + epicsSnprintf(readThreadName, 100, "%sRead", this->portName); + readPollerThreadId_ = epicsThreadCreate(readThreadName, + epicsThreadPriorityMedium, + epicsThreadGetStackSize(epicsThreadStackSmall), + (EPICSTHREADFUNC)readPollerC, + this); + forceCallback_ = true; + } + + epicsAtExit(modbusExitCallback, this); + + initialized_ = true; +} + + +/* asynDrvUser routines */ +asynStatus drvModbusAsyn::drvUserCreate(asynUser *pasynUser, + const char *drvInfo, + const char **pptypeName, size_t *psize) +{ + int i; + int offset; + const char *pstring; + static const char *functionName="drvUserCreate"; + + /* We are passed a string that identifies this command. + * Set dataType and/or pasynUser->reason based on this string */ + + pasynUser->drvUser = drvUser_; + if (initialized_ == false) { + pasynManager->enable(pasynUser, 0); + return asynDisabled; + } + + struct drvInfoRAII_t { + char *str; + drvInfoRAII_t(const char *drvInfo) : str(epicsStrDup(drvInfo)) { + } + ~drvInfoRAII_t() { + free(str); + } + } drvInfoRAII(drvInfo); + + /* Everything after an '=' sign is optional, strip it for now */ + char *local_drvInfo = drvInfoRAII.str; + char *equal_sign; + if ((equal_sign = strchr(local_drvInfo, '='))) { + equal_sign[0] = '\0'; + } + + for (i=0; igetAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + modbusDataType_t dataType = modbusDataTypes[i].dataType; + int len = -1; + if (equal_sign) { + switch (dataType) { + case dataTypeStringHigh: + case dataTypeStringLow: + case dataTypeStringHighLow: + case dataTypeStringLowHigh: + case dataTypeZStringHigh: + case dataTypeZStringLow: + case dataTypeZStringHighLow: + case dataTypeZStringLowHigh: + char *endptr; + len = strtol(equal_sign + 1, &endptr, 0); + if (endptr[0] != '\0' || len < 0) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid string length: %s\n", + driverName, functionName, this->portName, equal_sign + 1); + return asynError; + } + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid drvUser: %s\n", + driverName, functionName, this->portName, drvInfo); + return asynError; + } + } + + /* Update pasynUser->drvUser if needed */ + if (dataType != dataType_ || len != -1) { + modbusDrvUser_t *drvUser = (modbusDrvUser_t *) callocMustSucceed(1, sizeof(modbusDrvUser_t), functionName); + drvUser->dataType = dataType; + drvUser->len = len; + pasynUser->drvUser = drvUser; + } + pasynUser->reason = P_Data; + if (pptypeName) *pptypeName = epicsStrDup(MODBUS_DATA_STRING); + if (psize) *psize = sizeof(MODBUS_DATA_STRING); + asynPrint(pasynUser, ASYN_TRACE_FLOW, + "%s::%s, port %s data type=%s\n", + driverName, functionName, this->portName, pstring); + return asynSuccess; + } + } + + // If we get to here we call the base class + return asynPortDriver::drvUserCreate(pasynUser, drvInfo, pptypeName, psize); + +} + + +asynStatus drvModbusAsyn::drvUserDestroy(asynUser *pasynUser) +{ + if (pasynUser->drvUser != drvUser_) { + free(pasynUser->drvUser); + } + + pasynUser->drvUser = NULL; + + return asynSuccess; +} + + +/***********************/ +/* asynCommon routines */ +/***********************/ + +/* Connect */ +asynStatus drvModbusAsyn::connect(asynUser *pasynUser) +{ + int offset; + + if (initialized_ == false) return asynDisabled; + + pasynManager->getAddr(pasynUser, &offset); + if (offset < -1) return asynError; + if (absoluteAddressing_) { + if (offset > 65535) return asynError; + } else { + if (offset >= modbusLength_) return asynError; + } + pasynManager->exceptionConnect(pasynUser); + return asynSuccess; +} + +/* Report parameters */ +void drvModbusAsyn::report(FILE *fp, int details) +{ + fprintf(fp, "modbus port: %s\n", this->portName); + if (details) { + fprintf(fp, " initialized: %s\n", initialized_ ? "true" : "false"); + fprintf(fp, " asynOctet server: %s\n", octetPortName_); + fprintf(fp, " modbusSlave: %d\n", modbusSlave_); + fprintf(fp, " modbusFunction: %d\n", modbusFunction_); + fprintf(fp, " modbusStartAddress: 0%o\n", modbusStartAddress_); + fprintf(fp, " modbusLength: 0%o\n", modbusLength_); + fprintf(fp, " absoluteAddressing: %s\n", absoluteAddressing_ ? "true" : "false"); + fprintf(fp, " dataType: %d (%s)\n", dataType_, modbusDataTypes[dataType_].dataTypeString); + fprintf(fp, " plcType: %s\n", plcType_); + fprintf(fp, " I/O errors: %d\n", IOErrors_); + fprintf(fp, " Read OK: %d\n", readOK_); + fprintf(fp, " Write OK: %d\n", writeOK_); + fprintf(fp, " pollDelay: %f\n", pollDelay_); + fprintf(fp, " Time for last I/O %d msec\n", lastIOMsec_); + fprintf(fp, " Max. I/O time: %d msec\n", maxIOMsec_); + fprintf(fp, " Time per hist. bin: %d msec\n", histogramMsPerBin_); + } + asynPortDriver::report(fp, details); +} + +asynStatus drvModbusAsyn::getAddress(asynUser *pasynUser, int *address) +{ + // We use the asyn address for Modbus register addressing, but not for multiple addresses in asynPortDriver + *address = 0; + return asynSuccess; +} + + +/* +** asynUInt32D support +*/ +asynStatus drvModbusAsyn::readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, epicsUInt32 mask) +{ + int offset; + int modbusFunction; + static const char *functionName = "readUInt32D"; + + if (pasynUser->reason == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + /* If absolute addressing then there is no poller running */ + if (checkModbusFunction(&modbusFunction)) return asynError; + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction, + offset, data_, modbusLength_); + if (ioStatus_ != asynSuccess) return(ioStatus_); + offset = 0; + readOnceDone_ = true; + } else { + if (ioStatus_ != asynSuccess) return(ioStatus_); + } + *value = 0; + switch(modbusFunction_) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + *value = data_[offset]; + if ((mask != 0 ) && (mask != 0xFFFF)) *value &= mask; + break; + case MODBUS_WRITE_SINGLE_COIL: + case MODBUS_WRITE_MULTIPLE_COILS: + case MODBUS_WRITE_SINGLE_REGISTER: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + if (!readOnceDone_) return asynError; + *value = data_[offset]; + if ((mask != 0 ) && (mask != 0xFFFF)) *value &= mask; + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " offset=0%o, mask=0x%x, value=0x%x\n", + driverName, functionName, this->portName, modbusFunction_, + offset, mask, *value); + return asynSuccess; + } + else { + return asynPortDriver::readUInt32Digital(pasynUser, value, mask); + } +} + + +asynStatus drvModbusAsyn::writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, epicsUInt32 mask) +{ + int offset; + int modbusAddress; + int i; + epicsUInt16 data = value; + asynStatus status; + static const char *functionName = "writeUInt32D"; + + if (pasynUser->reason == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + modbusAddress = offset; + } else { + modbusAddress = modbusStartAddress_ + offset; + } + switch(modbusFunction_) { + case MODBUS_WRITE_SINGLE_COIL: + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, &data, 1); + if (status != asynSuccess) return(status); + break; + case MODBUS_WRITE_SINGLE_REGISTER: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + /* Do this as a read/modify/write if mask is not all 0 or all 1 */ + if ((mask == 0) || (mask == 0xFFFF)) { + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, &data, 1); + } else { + status = doModbusIO(modbusSlave_, MODBUS_READ_HOLDING_REGISTERS, + modbusAddress + readbackOffset_, &data, 1); + if (status != asynSuccess) return(status); + /* Set bits that are set in the value and set in the mask */ + data |= (value & mask); + /* Clear bits that are clear in the value and set in the mask */ + data &= (value | ~mask); + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, &data, 1); + } + if (status != asynSuccess) return(status); + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " address=0%o, mask=0x%x, value=0x%x\n", + driverName, functionName, this->portName, modbusFunction_, + modbusAddress, mask, data); + } + else if (pasynUser->reason == P_EnableHistogram) { + if ((value != 0) && enableHistogram_ == 0) { + /* We are turning on histogram enabling, erase existing data first */ + for (i=0; ireason == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + /* If absolute addressing then there is no poller running */ + if (checkModbusFunction(&modbusFunction)) return asynError; + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction, + offset, data_, modbusLength_); + if (ioStatus_ != asynSuccess) return(ioStatus_); + offset = 0; + readOnceDone_ = true; + } else { + if (ioStatus_ != asynSuccess) return(ioStatus_); + } + switch(modbusFunction_) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + *value = data_[offset]; + break; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + status = readPlcInt32(dataType, offset, value, &bufferLen); + if (status != asynSuccess) return status; + break; + case MODBUS_WRITE_SINGLE_COIL: + case MODBUS_WRITE_MULTIPLE_COILS: + if (!readOnceDone_) return asynError ; + *value = data_[offset]; + break; + case MODBUS_WRITE_SINGLE_REGISTER: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + if (!readOnceDone_) return asynError; + status = readPlcInt32(dataType, offset, value, &bufferLen); + if (status != asynSuccess) return status; + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " offset=0%o, value=0x%x\n", + driverName, functionName, this->portName, modbusFunction_, + offset, *value); + return asynSuccess; + } + else { + return asynPortDriver::readInt32(pasynUser, value); + } +} + + +asynStatus drvModbusAsyn::writeInt32(asynUser *pasynUser, epicsInt32 value) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int offset; + int modbusAddress; + int function = pasynUser->reason; + epicsUInt16 buffer[4]; + int bufferLen=0; + int i; + asynStatus status; + static const char *functionName = "writeInt32"; + + if (function == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + modbusAddress = offset; + offset = 0; + } else { + modbusAddress = modbusStartAddress_ + offset; + } + switch(modbusFunction_) { + case MODBUS_WRITE_SINGLE_COIL: + buffer[0] = value; + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, buffer, 1); + if (status != asynSuccess) return(status); + break; + case MODBUS_WRITE_SINGLE_REGISTER: + status = writePlcInt32(dataType, offset, value, buffer, &bufferLen); + if (status != asynSuccess) return(status); + for (i=0; iportName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " modbusAddress=0%o, buffer[0]=0x%x, bufferLen=%d\n", + driverName, functionName, this->portName, modbusFunction_, + modbusAddress, buffer[0], bufferLen); + } + else if (function == P_Read) { + /* Read the data for this driver. This can be used when the poller is disabled. */ + epicsEventSignal(readPollerEventId_); + } + else if (function == P_HistogramBinTime) { + /* Set the time per histogram bin in ms */ + histogramMsPerBin_ = value; + if (histogramMsPerBin_ < 1)histogramMsPerBin_ = 1; + /* Since the time might have changed erase existing data */ + for (i=0; ireason == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + /* If absolute addressing then there is no poller running */ + if (checkModbusFunction(&modbusFunction)) return asynError; + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction, + offset, data_, modbusLength_); + if (ioStatus_ != asynSuccess) return(ioStatus_); + offset = 0; + readOnceDone_ = true; + } else { + if (ioStatus_ != asynSuccess) return(ioStatus_); + } + switch(modbusFunction_) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + *value = data_[offset]; + break; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + status = readPlcInt64(dataType, offset, value, &bufferLen); + if (status != asynSuccess) return status; + break; + case MODBUS_WRITE_SINGLE_COIL: + case MODBUS_WRITE_MULTIPLE_COILS: + if (!readOnceDone_) return asynError ; + *value = data_[offset]; + break; + case MODBUS_WRITE_SINGLE_REGISTER: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + if (!readOnceDone_) return asynError; + status = readPlcInt64(dataType, offset, value, &bufferLen); + if (status != asynSuccess) return status; + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " offset=0%o, value=0x%llx\n", + driverName, functionName, this->portName, modbusFunction_, + offset, *value); + return asynSuccess; + } + else { + return asynPortDriver::readInt64(pasynUser, value); + } +} + + +asynStatus drvModbusAsyn::writeInt64(asynUser *pasynUser, epicsInt64 value) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int offset; + int modbusAddress; + int function = pasynUser->reason; + epicsUInt16 buffer[4]; + int bufferLen=0; + int i; + asynStatus status; + static const char *functionName = "writeInt64"; + + if (function == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + modbusAddress = offset; + offset = 0; + } else { + modbusAddress = modbusStartAddress_ + offset; + } + switch(modbusFunction_) { + case MODBUS_WRITE_SINGLE_COIL: + buffer[0] = (epicsUInt16)value; + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, buffer, 1); + if (status != asynSuccess) return(status); + break; + case MODBUS_WRITE_SINGLE_REGISTER: + status = writePlcInt64(dataType, offset, value, buffer, &bufferLen); + if (status != asynSuccess) return(status); + for (i=0; iportName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " modbusAddress=0%o, buffer[0]=0x%x, bufferLen=%d\n", + driverName, functionName, this->portName, modbusFunction_, + modbusAddress, buffer[0], bufferLen); + } + else { + return asynPortDriver::writeInt64(pasynUser, value); + } + return asynSuccess; +} + + +/* +** asynFloat64 support +*/ +asynStatus drvModbusAsyn::readFloat64 (asynUser *pasynUser, epicsFloat64 *value) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int offset; + int bufferLen; + int modbusFunction; + asynStatus status = asynSuccess; + static const char *functionName="readFloat64"; + + *value = 0; + + if (pasynUser->reason == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + /* If absolute addressing then there is no poller running */ + if (checkModbusFunction(&modbusFunction)) return asynError; + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction, + offset, data_, modbusLength_); + if (ioStatus_ != asynSuccess) return(ioStatus_); + offset = 0; + readOnceDone_ = true; + } else { + if (ioStatus_ != asynSuccess) return(ioStatus_); + } + switch(modbusFunction_) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + *value = data_[offset]; + break; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + status = readPlcFloat(dataType, offset, value, &bufferLen); + if (status != asynSuccess) return status; + break; + case MODBUS_WRITE_SINGLE_COIL: + case MODBUS_WRITE_MULTIPLE_COILS: + if (!readOnceDone_) return asynError; + *value = data_[offset]; + break; + case MODBUS_WRITE_SINGLE_REGISTER: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + if (!readOnceDone_) return asynError; + status = readPlcFloat(dataType, offset, value, &bufferLen); + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " offset=0%o, value=%f, status=%d\n", + driverName, functionName, this->portName, modbusFunction_, + offset, *value, status); + } + else { + return asynPortDriver::readFloat64(pasynUser, value); + } + + return asynSuccess; +} + + +asynStatus drvModbusAsyn::writeFloat64 (asynUser *pasynUser, epicsFloat64 value) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int offset; + int modbusAddress; + epicsUInt16 buffer[4]; + int bufferLen; + int i; + asynStatus status; + static const char *functionName="writeFloat64"; + + + if (pasynUser->reason == P_Data) { + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d\n", + driverName, functionName, this->portName, offset); + return asynError; + } + if (absoluteAddressing_) { + modbusAddress = offset; + offset = 0; + } else { + modbusAddress = modbusStartAddress_ + offset; + } + switch(modbusFunction_) { + case MODBUS_WRITE_SINGLE_COIL: + buffer[0] = (epicsUInt16)value; + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, buffer, 1); + if (status != asynSuccess) return(status); + break; + case MODBUS_WRITE_SINGLE_REGISTER: + status = writePlcFloat(dataType, offset, value, buffer, &bufferLen); + for (i=0; iportName, modbusFunction_); + return asynError; + } + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s function=0x%x," + " modbusAddress=0%o, buffer[0]=0x%x\n", + driverName, functionName, this->portName, modbusFunction_, + modbusAddress, buffer[0]); + } + else if (pasynUser->reason == P_PollDelay) { + pollDelay_ = value; + /* Send an event to the poller, because it might have a long poll time, or + * not be polling at all */ + epicsEventSignal(readPollerEventId_); + } + return asynSuccess; +} + + + +/* +** asynInt32Array support +*/ +asynStatus drvModbusAsyn::readInt32Array (asynUser *pasynUser, epicsInt32 *data, size_t maxChans, size_t *nactual) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int function = pasynUser->reason; + int offset; + size_t i; + int bufferLen; + int modbusFunction; + asynStatus status; + static const char *functionName="readInt32Array"; + + *nactual = 0; + pasynManager->getAddr(pasynUser, &offset); + if (function == P_Data) { + if (absoluteAddressing_) { + /* If absolute addressing then there is no poller running */ + if (checkModbusFunction(&modbusFunction)) return asynError; + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction, + offset, data_, modbusLength_); + if (ioStatus_ != asynSuccess) return(ioStatus_); + offset = 0; + } else { + if (ioStatus_ != asynSuccess) return(ioStatus_); + } + switch(modbusFunction_) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + for (i=0; iportName, modbusFunction_); + return asynError; + } + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)data_, i*2, + "%s::%sArray port %s, function=0x%x\n", + driverName, functionName, this->portName, modbusFunction_); + } + else if (function == P_ReadHistogram) { + for (i=0; ireason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + return asynError; + } + + *nactual = i; + return asynSuccess; +} + + +asynStatus drvModbusAsyn::writeInt32Array(asynUser *pasynUser, epicsInt32 *data, size_t maxChans) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int function = pasynUser->reason; + int modbusAddress; + epicsUInt16 *dataAddress; + int nwrite=0; + size_t i; + int offset; + int outIndex; + int bufferLen; + asynStatus status; + static const char *functionName="writeInt32Array"; + + pasynManager->getAddr(pasynUser, &offset); + if (absoluteAddressing_) { + modbusAddress = offset; + dataAddress = data_; + outIndex = 0; + } else { + modbusAddress = modbusStartAddress_ + offset; + dataAddress = data_ + offset; + outIndex = offset; + } + if (function == P_Data) { + switch(modbusFunction_) { + case MODBUS_WRITE_MULTIPLE_COILS: + /* Need to copy data to local buffer to convert to epicsUInt16 */ + for (i=0; iportName, modbusFunction_); + return asynError; + } + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)data_, nwrite*2, + "%s::%s port %s, function=0x%x\n", + driverName, functionName, this->portName, modbusFunction_); + } + else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + return asynError; + } + return asynSuccess; +} + + +/* +** asynOctet support +*/ +asynStatus drvModbusAsyn::readOctet(asynUser *pasynUser, char *data, size_t maxChars, size_t *nactual, int *eomReason) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int function = pasynUser->reason; + int offset; + int bufferLen; + int modbusFunction; + static const char *functionName="readOctet"; + + maxChars = getStringLen(pasynUser, maxChars); + + *nactual = 0; + pasynManager->getAddr(pasynUser, &offset); + if (function == P_Data) { + if (absoluteAddressing_) { + /* If absolute addressing then there is no poller running */ + if (checkModbusFunction(&modbusFunction)) return asynError; + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction, + offset, data_, modbusLength_); + if (ioStatus_ != asynSuccess) return(ioStatus_); + offset = 0; + } else { + if (ioStatus_ != asynSuccess) return(ioStatus_); + } + switch(modbusFunction_) { + case MODBUS_WRITE_MULTIPLE_REGISTERS: + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + if (!readOnceDone_) return asynError; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + readPlcString(dataType, offset, data, maxChars, &bufferLen); + *nactual = bufferLen; + *eomReason = ASYN_EOM_CNT; + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)data_, *nactual, + "%s::%s port %s, function=0x%x\n", + driverName, functionName, this->portName, modbusFunction_); + } + else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + return asynError; + } + + return asynSuccess; +} + + +asynStatus drvModbusAsyn::writeOctet (asynUser *pasynUser, const char *data, size_t maxChars, size_t *nActual) +{ + modbusDataType_t dataType = getDataType(pasynUser); + int function = pasynUser->reason; + int modbusAddress; + epicsUInt16 *dataAddress; + int offset; + int bufferLen; + asynStatus status; + size_t newMaxChars = maxChars; + char zeroData[MAX_WRITE_WORDS * 2]; + static const char *functionName="writeOctet"; + + if (isZeroTerminatedString(dataType)) { + /* Create a local copy that is guaranteed to have a terminating zero */ + strncpy(zeroData, data, getStringLen(pasynUser, maxChars)); + data = zeroData; + /* Account for the terminating zero character */ + newMaxChars = getStringLen(pasynUser, maxChars + 1); + /* Check if the string needs to be truncated */ + if (newMaxChars > maxChars) + zeroData[maxChars] = '\0'; + else + zeroData[newMaxChars - 1] = '\0'; + } else { + newMaxChars = getStringLen(pasynUser, maxChars); + } + + pasynManager->getAddr(pasynUser, &offset); + if (absoluteAddressing_) { + modbusAddress = offset; + /* data_ is long enough to hold one data item only */ + offset = 0; + dataAddress = data_; + } else { + modbusAddress = modbusStartAddress_ + offset; + dataAddress = data_ + offset; + } + if (function == P_Data) { + switch(modbusFunction_) { + case MODBUS_WRITE_MULTIPLE_REGISTERS: + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + writePlcString(dataType, offset, data, newMaxChars, nActual, &bufferLen); + if (bufferLen <= 0) break; + /* The terminating zero is added by us; it must not be included in 'nActual' */ + if (isZeroTerminatedString(dataType)) + --*nActual; + status = doModbusIO(modbusSlave_, modbusFunction_, + modbusAddress, dataAddress, bufferLen); + if (status != asynSuccess) return(status); + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid request for Modbus" + " function %d\n", + driverName, functionName, this->portName, modbusFunction_); + return asynError; + } + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)data_, bufferLen*2, + "%s::%s port %s, function=0x%x\n", + driverName, functionName, this->portName, modbusFunction_); + } + else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + return asynError; + } + return asynSuccess; +} + + +static void readPollerC(void *drvPvt) +{ + drvModbusAsyn *pPvt = (drvModbusAsyn *)drvPvt; + + pPvt->readPoller(); +} + + +/* +**************************************************************************** +** Poller thread for port reads + One instance spawned per asyn port +**************************************************************************** +*/ + +void drvModbusAsyn::readPoller() +{ + + ELLLIST *pclientList; + interruptNode *pnode; + int offset; + int bufferLen; + int anyChanged; + asynStatus prevIOStatus=asynSuccess; + asynUser *pasynUser; + int i; + epicsUInt16 newValue, prevValue, mask; + epicsUInt32 uInt32Value; + epicsInt32 int32Value; + epicsInt64 int64Value; + epicsFloat64 float64Value; + modbusDataType_t dataType; + char stringBuffer[MAX_READ_WORDS * 2]; + epicsUInt16 *prevData; /* Previous contents of memory buffer */ + epicsInt32 *int32Data; /* Buffer used for asynInt32Array callbacks */ + static const char *functionName="readPoller"; + + prevData = (epicsUInt16 *) callocMustSucceed(modbusLength_, sizeof(epicsUInt16), + "drvModbusAsyn::readPoller"); + int32Data = (epicsInt32 *) callocMustSucceed(modbusLength_, sizeof(epicsInt32), + "drvModbusAsyn::readPoller"); + + lock(); + + /* Loop forever */ + while (1) + { + /* Sleep for the poll delay or waiting for epicsEvent with the port unlocked */ + unlock(); + if (pollDelay_ > 0.0) { + epicsEventWaitWithTimeout(readPollerEventId_, pollDelay_); + } else { + epicsEventWait(readPollerEventId_); + } + + if (modbusExiting_) break; + + /* Lock the port. It is important that the port be locked so other threads cannot access the pPlc + * structure while the poller thread is running. */ + lock(); + + /* Read the data */ + ioStatus_ = doModbusIO(modbusSlave_, modbusFunction_, + modbusStartAddress_, data_, modbusLength_); + /* If we have an I/O error this time and the previous time, just try again */ + if (ioStatus_ != asynSuccess && + ioStatus_ == prevIOStatus) { + epicsThreadSleep(1.0); + continue; + } + + /* If the I/O status has changed then force callbacks */ + if (ioStatus_ != prevIOStatus) forceCallback_ = true; + + /* See if any memory location has actually changed. + * If not, no need to do callbacks. */ + anyChanged = memcmp(data_, prevData, + modbusLength_*sizeof(epicsUInt16)); + + /* Don't start polling until EPICS interruptAccept flag is set, + * because it does callbacks to device support. */ + while (!interruptAccept) { + unlock(); + epicsThreadSleep(0.1); + lock(); + } + + /* Process callbacks to device support. */ + + /* See if there are any asynUInt32Digital callbacks registered to be called + * when data changes. These callbacks only happen if the value has changed */ + if (forceCallback_ || anyChanged){ + pasynManager->interruptStart(asynStdInterfaces.uInt32DigitalInterruptPvt, &pclientList); + pnode = (interruptNode *)ellFirst(pclientList); + asynUInt32DigitalInterrupt *pUInt32D; + while (pnode) { + pUInt32D = (asynUInt32DigitalInterrupt *)pnode->drvPvt; + pasynUser = pUInt32D->pasynUser; + if (pasynUser->reason != P_Data) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + break; + } + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d, max=%d\n", + driverName, functionName, this->portName, offset, modbusLength_); + break; + } + mask = pUInt32D->mask; + newValue = data_[offset]; + if ((mask != 0 ) && (mask != 0xFFFF)) newValue &= mask; + prevValue = prevData[offset]; + if ((mask != 0 ) && (mask != 0xFFFF)) prevValue &= mask; + /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ + pasynUser->auxStatus = ioStatus_; + if (forceCallback_ || (newValue != prevValue)) { + uInt32Value = newValue; + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s, calling asynUInt32Digital client %p" + " mask=0x%x, callback=%p, data=0x%x\n", + driverName, functionName, pUInt32D, pUInt32D->mask, pUInt32D->callback, uInt32Value); + pUInt32D->callback(pUInt32D->userPvt, pasynUser, uInt32Value); + } + pnode = (interruptNode *)ellNext(&pnode->node); + } + pasynManager->interruptEnd(asynStdInterfaces.uInt32DigitalInterruptPvt); + } + + /* See if there are any asynInt32 callbacks registered to be called. + * These are called even if the data has not changed, because we could be doing + * ADC averaging */ + pasynManager->interruptStart(asynStdInterfaces.int32InterruptPvt, &pclientList); + pnode = (interruptNode *)ellFirst(pclientList); + while (pnode) { + asynInt32Interrupt *pInt32; + pInt32 = (asynInt32Interrupt *)pnode->drvPvt; + pasynUser = pInt32->pasynUser; + if (pasynUser->reason != P_Data) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + break; + } + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid memory request %d, max=%d\n", + driverName, functionName, this->portName, offset, modbusLength_); + break; + } + dataType = getDataType(pasynUser); + readPlcInt32(dataType, offset, &int32Value, &bufferLen); + /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ + pasynUser->auxStatus = ioStatus_; + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s, calling asynInt32 client %p" + " callback=%p, data=0x%x\n", + driverName, functionName, pInt32, pInt32->callback, int32Value); + pInt32->callback(pInt32->userPvt, pasynUser, + int32Value); + pnode = (interruptNode *)ellNext(&pnode->node); + } + pasynManager->interruptEnd(asynStdInterfaces.int32InterruptPvt); + + /* See if there are any asynInt64 callbacks registered to be called. + * These are called even if the data has not changed, because we could be doing + * ADC averaging */ + pasynManager->interruptStart(asynStdInterfaces.int64InterruptPvt, &pclientList); + pnode = (interruptNode *)ellFirst(pclientList); + while (pnode) { + asynInt64Interrupt *pInt64; + pInt64 = (asynInt64Interrupt *)pnode->drvPvt; + pasynUser = pInt64->pasynUser; + if (pasynUser->reason != P_Data) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + break; + } + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid memory request %d, max=%d\n", + driverName, functionName, this->portName, offset, modbusLength_); + break; + } + dataType = getDataType(pasynUser); + readPlcInt64(dataType, offset, &int64Value, &bufferLen); + /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ + pasynUser->auxStatus = ioStatus_; + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s, calling asynInt64 client %p" + " callback=%p, data=0x%llx\n", + driverName, functionName, pInt64, pInt64->callback, int64Value); + pInt64->callback(pInt64->userPvt, pasynUser, + int64Value); + pnode = (interruptNode *)ellNext(&pnode->node); + } + pasynManager->interruptEnd(asynStdInterfaces.int64InterruptPvt); + + /* See if there are any asynFloat64 callbacks registered to be called. + * These are called even if the data has not changed, because we could be doing + * ADC averaging */ + pasynManager->interruptStart(asynStdInterfaces.float64InterruptPvt, &pclientList); + pnode = (interruptNode *)ellFirst(pclientList); + while (pnode) { + asynFloat64Interrupt *pFloat64; + pFloat64 = (asynFloat64Interrupt *)pnode->drvPvt; + pasynUser = pFloat64->pasynUser; + if (pasynUser->reason != P_Data) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + break; + } + pasynManager->getAddr(pasynUser, &offset); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid memory request %d, max=%d\n", + driverName, functionName, this->portName, offset, modbusLength_); + break; + } + dataType = getDataType(pasynUser); + readPlcFloat(dataType, offset, &float64Value, &bufferLen); + /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ + pFloat64->pasynUser->auxStatus = ioStatus_; + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s, calling asynFloat64 client %p" + " callback=%p, data=%f\n", + driverName, functionName, pFloat64, pFloat64->callback, float64Value); + pFloat64->callback(pFloat64->userPvt, pasynUser, + float64Value); + pnode = (interruptNode *)ellNext(&pnode->node); + } + pasynManager->interruptEnd(asynStdInterfaces.float64InterruptPvt); + + + /* See if there are any asynInt32Array callbacks registered to be called. + * These are only called when data changes */ + if (forceCallback_ || anyChanged){ + pasynManager->interruptStart(asynStdInterfaces.int32ArrayInterruptPvt, &pclientList); + pnode = (interruptNode *)ellFirst(pclientList); + while (pnode) { + asynInt32ArrayInterrupt *pInt32Array; + pInt32Array = (asynInt32ArrayInterrupt *)pnode->drvPvt; + pasynUser = pInt32Array->pasynUser; + if (pasynUser->reason != P_Data) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + break; + } + /* Need to copy data to epicsInt32 buffer for callback */ + pasynManager->getAddr(pasynUser, &offset); + dataType = getDataType(pasynUser); + for (i=0; iauxStatus = ioStatus_; + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s, calling client %p" + "callback=%p\n", + driverName, functionName, pInt32Array, pInt32Array->callback); + pInt32Array->callback(pInt32Array->userPvt, pasynUser, + int32Data, i); + pnode = (interruptNode *)ellNext(&pnode->node); + } + pasynManager->interruptEnd(asynStdInterfaces.int32ArrayInterruptPvt); + } + + /* See if there are any asynOctet callbacks registered to be called + * when data changes. These callbacks only happen if any data in this port has changed */ + if (forceCallback_ || anyChanged){ + pasynManager->interruptStart(asynStdInterfaces.octetInterruptPvt, &pclientList); + pnode = (interruptNode *)ellFirst(pclientList); + while (pnode) { + asynOctetInterrupt *pOctet; + pOctet = (asynOctetInterrupt *)pnode->drvPvt; + pasynUser = pOctet->pasynUser; + if (pasynUser->reason != P_Data) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid pasynUser->reason %d\n", + driverName, functionName, this->portName, pasynUser->reason); + break; + } + pasynManager->getAddr(pasynUser, &offset); + dataType = getDataType(pasynUser); + if (checkOffset(offset)) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s invalid offset %d, max=%d\n", + driverName, functionName, this->portName, offset, modbusLength_); + break; + } + readPlcString(dataType, offset, stringBuffer, getStringLen(pasynUser, sizeof(stringBuffer)), &bufferLen); + /* Set the status flag in pasynUser so I/O Intr scanned records can set alarm status */ + pasynUser->auxStatus = ioStatus_; + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s, calling client %p" + " callback=%p, data=%s\n", + driverName, functionName, pOctet, pOctet->callback, stringBuffer); + pOctet->callback(pOctet->userPvt, pasynUser, stringBuffer, bufferLen, ASYN_EOM_CNT); + pnode = (interruptNode *)ellNext(&pnode->node); + } + pasynManager->interruptEnd(asynStdInterfaces.octetInterruptPvt); + } + + /* Reset the forceCallback flag */ + forceCallback_ = false; + + /* Set the previous I/O status */ + prevIOStatus = ioStatus_; + + /* Copy the new data to the previous data */ + memcpy(prevData, data_, modbusLength_*sizeof(epicsUInt16)); + } +} + + +asynStatus drvModbusAsyn::doModbusIO(int slave, int function, int start, + epicsUInt16 *data, int len) +{ + modbusReadRequest *readReq; + modbusReadResponse *readResp; + modbusWriteSingleRequest *writeSingleReq; + /* modbusWriteSingleResponse *writeSingleResp; */ + modbusWriteMultipleRequest *writeMultipleReq; + /* modbusWriteMultipleResponse *writeMultipleResp; */ + modbusReadWriteMultipleRequest *readWriteMultipleReq; + modbusExceptionResponse *exceptionResp; + int requestSize=0; + int replySize; + unsigned char *pCharIn, *pCharOut; + epicsUInt16 *pShortIn, *pShortOut; + epicsUInt16 bitOutput; + int byteCount; + asynStatus status=asynSuccess; + int i; + epicsTimeStamp startTime, endTime; + size_t nwrite, nread; + int eomReason; + double dT; + int msec; + int bin; + unsigned char mask=0; + int autoConnect; + static const char *functionName = "doModbusIO"; + + /* If the Octet driver is not set for autoConnect then do connection management ourselves */ + status = pasynManager->isAutoConnect(pasynUserOctet_, &autoConnect); + if (!autoConnect) { + /* See if we are connected */ + int itemp; + status = pasynManager->isConnected(pasynUserOctet_, &itemp); + isConnected_ = (itemp != 0) ? true : false; + /* If we have an I/O error or are disconnected then disconnect device and reconnect */ + if ((ioStatus_ != asynSuccess) || !isConnected_) { + if (ioStatus_ != asynSuccess) + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s has I/O error\n", + driverName, functionName, this->portName); + if (!isConnected_) + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s is disconnected\n", + driverName, functionName, this->portName); + status = pasynCommonSyncIO->disconnectDevice(pasynUserCommon_); + if (status == asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s port %s disconnect device OK\n", + driverName, functionName, this->portName); + } else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s disconnect error=%s\n", + driverName, functionName, this->portName, pasynUserOctet_->errorMessage); + } + status = pasynCommonSyncIO->connectDevice(pasynUserCommon_); + if (status == asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_FLOW, + "%s::%s port %s connect device OK\n", + driverName, functionName, this->portName); + } else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s connect device error=%s\n", + driverName, functionName, this->portName, pasynUserOctet_->errorMessage); + goto done; + } + } + } + + switch (function) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + readReq = (modbusReadRequest *)modbusRequest_; + readReq->slave = slave; + readReq->fcode = function; + readReq->startReg = htons((epicsUInt16)start); + readReq->numRead = htons((epicsUInt16)len); + requestSize = sizeof(modbusReadRequest); + /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ + replySize = sizeof(modbusReadResponse) - 1 + len/8; + if (len % 8) replySize++; + break; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + readReq = (modbusReadRequest *)modbusRequest_; + readReq->slave = slave; + readReq->fcode = function; + readReq->startReg = htons((epicsUInt16)start); + readReq->numRead = htons((epicsUInt16)len); + requestSize = sizeof(modbusReadRequest); + /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ + replySize = sizeof(modbusReadResponse) - 1 + len*2; + break; + case MODBUS_READ_INPUT_REGISTERS_F23: + readWriteMultipleReq = (modbusReadWriteMultipleRequest *)modbusRequest_; + readWriteMultipleReq->slave = slave; + readWriteMultipleReq->fcode = MODBUS_READ_WRITE_MULTIPLE_REGISTERS; + readWriteMultipleReq->startReadReg = htons((epicsUInt16)start); + readWriteMultipleReq->numRead = htons((epicsUInt16)len); + readWriteMultipleReq->startWriteReg = htons((epicsUInt16)start); + /* It seems that one cannot specify numOutput=0 to not write values, at least the Modbus Slave + * simulator does not allow this. + * But nothing will be written if the data part of the message is 0 length. + * So we set numOutput to one word and set the message so the data length is 0. */ + readWriteMultipleReq->numOutput = htons(1); + readWriteMultipleReq->byteCount = 2; + /* The -1 below is because the modbusReadWriteMultipleRequest struct already has 1 byte of data, + and we don't want to send it. */ + requestSize = sizeof(modbusReadWriteMultipleRequest) - 1; + /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ + replySize = sizeof(modbusReadResponse) - 1 + len*2; + break; + case MODBUS_WRITE_SINGLE_COIL: + writeSingleReq = (modbusWriteSingleRequest *)modbusRequest_; + writeSingleReq->slave = slave; + writeSingleReq->fcode = function; + writeSingleReq->startReg = htons((epicsUInt16)start); + if (*data) bitOutput = 0xFF00; + else bitOutput = 0; + writeSingleReq->data = htons(bitOutput); + requestSize = sizeof(modbusWriteSingleRequest); + replySize = sizeof(modbusWriteSingleResponse); + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s WRITE_SINGLE_COIL" + " address=0%o value=0x%x\n", + driverName, functionName, this->portName, start, bitOutput); + break; + case MODBUS_WRITE_SINGLE_REGISTER: + writeSingleReq = (modbusWriteSingleRequest *)modbusRequest_; + writeSingleReq->slave = slave; + writeSingleReq->fcode = function; + writeSingleReq->startReg = htons((epicsUInt16)start); + writeSingleReq->data = (epicsUInt16)*data; + writeSingleReq->data = htons(writeSingleReq->data); + requestSize = sizeof(modbusWriteSingleRequest); + replySize = sizeof(modbusWriteSingleResponse); + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s WRITE_SINGLE_REGISTER" + " address=0%o value=0x%x\n", + driverName, functionName, this->portName, start, *data); + break; + case MODBUS_WRITE_MULTIPLE_COILS: + writeMultipleReq = (modbusWriteMultipleRequest *)modbusRequest_; + writeMultipleReq->slave = slave; + writeMultipleReq->fcode = function; + writeMultipleReq->startReg = htons((epicsUInt16)start); + /* Pack bits into output */ + pShortIn = (epicsUInt16 *)data; + pCharOut = (unsigned char *)&writeMultipleReq->data; + /* Subtract 1 because it will be incremented first time */ + pCharOut--; + for (i=0; inumOutput = htons(len); + byteCount = (int) (pCharOut - writeMultipleReq->data + 1); + writeMultipleReq->byteCount = byteCount; + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)writeMultipleReq->data, byteCount, + "%s::%s port %s WRITE_MULTIPLE_COILS\n", + driverName, functionName, this->portName); + requestSize = sizeof(modbusWriteMultipleRequest) + byteCount - 1; + replySize = sizeof(modbusWriteMultipleResponse); + break; + case MODBUS_WRITE_MULTIPLE_REGISTERS: + writeMultipleReq = (modbusWriteMultipleRequest *)modbusRequest_; + writeMultipleReq->slave = slave; + writeMultipleReq->fcode = function; + writeMultipleReq->startReg = htons((epicsUInt16)start); + pShortIn = (epicsUInt16 *)data; + pShortOut = (epicsUInt16 *)&writeMultipleReq->data; + for (i=0; inumOutput = htons(len); + byteCount = 2*len; + writeMultipleReq->byteCount = byteCount; + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)writeMultipleReq->data, byteCount, + "%s::%s port %s WRITE_MULTIPLE_REGISTERS\n", + driverName, functionName, this->portName); + requestSize = sizeof(modbusWriteMultipleRequest) + byteCount - 1; + replySize = sizeof(modbusWriteMultipleResponse); + break; + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + readWriteMultipleReq = (modbusReadWriteMultipleRequest *)modbusRequest_; + readWriteMultipleReq->slave = slave; + readWriteMultipleReq->fcode = MODBUS_READ_WRITE_MULTIPLE_REGISTERS; + readWriteMultipleReq->startReadReg = htons((epicsUInt16)start); + /* We don't actually do anything with the values read from the device, but it does not + * seem to be allowed to specify numRead=0, so we always read one word from the same address + * we write to. */ + nread = 1; + readWriteMultipleReq->numRead = htons((epicsUInt16)nread); + readWriteMultipleReq->startWriteReg = htons((epicsUInt16)start); + pShortIn = (epicsUInt16 *)data; + pShortOut = (epicsUInt16 *)&readWriteMultipleReq->data; + for (i=0; inumOutput = htons(len); + byteCount = 2*len; + readWriteMultipleReq->byteCount = byteCount; + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)readWriteMultipleReq->data, byteCount, + "%s::%s port %s WRITE_MULTIPLE_REGISTERS_F23\n", + driverName, functionName, this->portName); + requestSize = sizeof(modbusReadWriteMultipleRequest) + byteCount - 1; + /* The -1 below is because the modbusReadResponse struct already has 1 byte of data */ + replySize = (int)(sizeof(modbusReadResponse) + 2*nread - 1); + break; + + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unsupported function code %d\n", + driverName, functionName, this->portName, function); + status = asynError; + goto done; + } + + /* Do the Modbus I/O as a write/read cycle */ + epicsTimeGetCurrent(&startTime); + status = pasynOctetSyncIO->writeRead(pasynUserOctet_, + modbusRequest_, requestSize, + modbusReply_, replySize, + MODBUS_READ_TIMEOUT, + &nwrite, &nread, &eomReason); + epicsTimeGetCurrent(&endTime); + asynPrint(pasynUserSelf, ASYN_TRACEIO_DRIVER, + "%s::%s port %s called pasynOctetSyncIO->writeRead, status=%d, requestSize=%d, replySize=%d, nwrite=%d, nread=%d, eomReason=%d\n", + driverName, functionName, this->portName, status, requestSize, replySize, (int)nwrite, (int)nread, eomReason); + + if (status != prevIOStatus_) { + if (status != asynSuccess) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s error calling writeRead," + " error=%s, nwrite=%d/%d, nread=%d\n", + driverName, functionName, this->portName, + pasynUserOctet_->errorMessage, (int)nwrite, requestSize, (int)nread); + } else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s writeRead status back to normal having had %d errors," + " nwrite=%d/%d, nread=%d\n", + driverName, functionName, this->portName, + currentIOErrors_, (int)nwrite, requestSize, (int)nread); + currentIOErrors_ = 0; + } + prevIOStatus_ = status; + } + if (status != asynSuccess) { + IOErrors_++; + setIntegerParam(P_IOErrors, IOErrors_); + currentIOErrors_++; + goto done; + } + + dT = epicsTimeDiffInSeconds(&endTime, &startTime); + msec = (int)(dT*1000. + 0.5); + lastIOMsec_ = msec; + setIntegerParam(P_LastIOTime, msec); + if (msec > maxIOMsec_) { + maxIOMsec_ = msec; + setIntegerParam(P_MaxIOTime, msec); + } + if (enableHistogram_) { + bin = msec /histogramMsPerBin_; + if (bin < 0) bin = 0; + /* Longer times go in last bin of histogram */ + if (bin >= HISTOGRAM_LENGTH-1) bin = HISTOGRAM_LENGTH-1; + timeHistogram_[bin]++; + } + + /* See if there is a Modbus exception */ + readResp = (modbusReadResponse *)modbusReply_; + if (readResp->fcode & MODBUS_EXCEPTION_FCN) { + exceptionResp = (modbusExceptionResponse *)modbusReply_; + if (exceptionResp->exception == 5) { + // Exception 5 is a warning that the command will take a long time to execute, + // but it is not an error. + asynPrint(pasynUserSelf, ASYN_TRACE_WARNING, + "%s::%s port %s Modbus exception=%d\n", + driverName, functionName, this->portName, exceptionResp->exception); + status = asynSuccess; + } + else { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s port %s Modbus exception=%d\n", + driverName, functionName, this->portName, exceptionResp->exception); + status = asynError; + } + goto done; + } + + /* Make sure the function code in the response is the same as the one + * in the request? */ + + switch (function) { + case MODBUS_READ_COILS: + case MODBUS_READ_DISCRETE_INPUTS: + readOK_++; + setIntegerParam(P_ReadOK, readOK_); + readResp = (modbusReadResponse *)modbusReply_; + nread = readResp->byteCount; + pCharIn = (unsigned char *)&readResp->data; + /* Subtract 1 because it will be incremented first time */ + pCharIn--; + /* We assume we got len bits back, since we are only told bytes */ + for (i=0; iportName); + break; + case MODBUS_READ_HOLDING_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS: + case MODBUS_READ_INPUT_REGISTERS_F23: + readOK_++; + setIntegerParam(P_ReadOK, readOK_); + readResp = (modbusReadResponse *)modbusReply_; + nread = readResp->byteCount/2; + pShortIn = (epicsUInt16 *)&readResp->data; + /* Check to make sure we got back the expected number of words */ + if ((int)nread != len) { + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s expected %d words, actually received %d\n", + driverName, functionName, this->portName, len, (int)nread); + status = asynError; + goto done; + } + for (i=0; i<(int)nread; i++) { + data[i] = ntohs(pShortIn[i]); + } + asynPrintIO(pasynUserSelf, ASYN_TRACEIO_DRIVER, + (char *)data, nread*2, + "%s::%s port %s READ_REGISTERS\n", + driverName, functionName, this->portName); + break; + + /* We don't do anything with responses to writes for now. + * Could add error checking. */ + case MODBUS_WRITE_SINGLE_COIL: + case MODBUS_WRITE_SINGLE_REGISTER: + writeOK_++; + setIntegerParam(P_WriteOK, writeOK_); + /* Not using value for now so comment out to avoid compiler warning + writeSingleResp = (modbusWriteSingleResponse *)modbusReply_; + */ + break; + case MODBUS_WRITE_MULTIPLE_COILS: + case MODBUS_WRITE_MULTIPLE_REGISTERS: + writeOK_++; + setIntegerParam(P_WriteOK, writeOK_); + /* Not using value for now so comment out to avoid compiler warning + writeMultipleResp = (modbusWriteMultipleResponse *)modbusReply_; + */ + break; + case MODBUS_WRITE_MULTIPLE_REGISTERS_F23: + writeOK_++; + setIntegerParam(P_WriteOK, writeOK_); + //readResp = (modbusReadResponse *)modbusReply_; + break; + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unsupported function code %d\n", + driverName, functionName, this->portName, function); + status = asynError; + goto done; + } + + done: + return status; +} + +modbusDataType_t drvModbusAsyn::getDataType(asynUser *pasynUser) +{ + modbusDataType_t dataType; + if (pasynUser->drvUser) { + dataType = ((modbusDrvUser_t *)pasynUser->drvUser)->dataType; + } else { + dataType = dataType_; + } + return dataType; +} + +int drvModbusAsyn::getStringLen(asynUser *pasynUser, size_t maxLen) +{ + size_t len = maxLen; + + if (pasynUser->drvUser) { + int drvlen = ((modbusDrvUser_t *)pasynUser->drvUser)->len; + if (drvlen > -1 && (size_t)drvlen < maxLen) + len = drvlen; + } + return (int)len; +} + +bool drvModbusAsyn::isZeroTerminatedString(modbusDataType_t dataType) +{ + switch (dataType) { + case dataTypeZStringHigh: + case dataTypeZStringLow: + case dataTypeZStringHighLow: + case dataTypeZStringLowHigh: + return true; + + default: + return false; + } + + return false; +} + +asynStatus drvModbusAsyn::checkOffset(int offset) +{ + if (offset < 0) return asynError; + if (absoluteAddressing_) { + if (offset > 65535) return asynError; + } else { + if (offset >= modbusLength_) return asynError; + } + return asynSuccess; +} + +asynStatus drvModbusAsyn::checkModbusFunction(int *modbusFunction) +{ + /* If this is an initial read operation on a write function code and + * pollDelay is not > 0 then return error */ + if (readOnceFunction_ && (pollDelay_ <= 0)) return asynError; + *modbusFunction = readOnceFunction_ ? readOnceFunction_ : modbusFunction_; + return asynSuccess; +} + +asynStatus drvModbusAsyn::readPlcInt32(modbusDataType_t dataType, int offset, epicsInt32 *output, int *bufferLen) +{ + asynStatus status; + epicsInt64 i64Value; + + status = readPlcInt64(dataType, offset, &i64Value, bufferLen); + *output = (epicsInt32)i64Value; + return status; +} + +asynStatus drvModbusAsyn::readPlcInt64(modbusDataType_t dataType, int offset, epicsInt64 *output, int *bufferLen) +{ + union { + epicsInt32 i32; + epicsUInt32 ui32; + epicsInt64 i64; + epicsUInt64 ui64; + epicsUInt16 ui16[4]; + } intUnion; + /* Default to little-endian */ + int w32_0=0, w32_1=1, w64_0=0, w64_1=1, w64_2=2, w64_3=3; + if (EPICS_FLOAT_WORD_ORDER == EPICS_ENDIAN_BIG){ + w32_0=1; w32_1=0; w64_0=3; w64_1=2; w64_2=1; w64_3=0; + } + epicsUInt16 ui16Value; + epicsInt64 i64Result=0; + asynStatus status = asynSuccess; + epicsFloat64 fValue; + int i; + int mult=1; + int signMask = 0x8000; + int negative = 0; + bool isUnsigned = false; + static const char *functionName="readPlcInt64"; + + ui16Value = data_[offset]; + *bufferLen = 1; + switch (dataType) { + case dataTypeUInt16: + i64Result = ui16Value; + break; + + case dataTypeInt16SM: + i64Result = ui16Value; + if (i64Result & signMask) { + i64Result &= ~signMask; + i64Result = -(epicsInt16)i64Result; + } + break; + + case dataTypeBCDSigned: + if (ui16Value & signMask) { + negative=1; + ui16Value &= ~signMask; + } /* Note: no break here! */ + case dataTypeBCDUnsigned: + for (i=0; i<4; i++) { + i64Result += (ui16Value & 0xF)*mult; + mult = mult*10; + ui16Value = ui16Value >> 4; + } + if (negative) i64Result = -i64Result; + break; + + case dataTypeInt16: + i64Result = (epicsInt16)ui16Value; + break; + + case dataTypeUInt32LE: + isUnsigned = true; + case dataTypeInt32LE: + intUnion.ui16[w32_0] = data_[offset]; + intUnion.ui16[w32_1] = data_[offset+1]; + i64Result = isUnsigned ? (epicsInt64)intUnion.ui32 : (epicsInt64)intUnion.i32; + *bufferLen = 2; + break; + + case dataTypeUInt32LEBS: + isUnsigned = true; + case dataTypeInt32LEBS: + intUnion.ui16[w32_0] = bswap16(data_[offset]); + intUnion.ui16[w32_1] = bswap16(data_[offset+1]); + i64Result = isUnsigned ? (epicsInt64)intUnion.ui32 : (epicsInt64)intUnion.i32; + *bufferLen = 2; + break; + + case dataTypeUInt32BE: + isUnsigned = true; + case dataTypeInt32BE: + intUnion.ui16[w32_1] = data_[offset]; + intUnion.ui16[w32_0] = data_[offset+1]; + i64Result = isUnsigned ? (epicsInt64)intUnion.ui32 : (epicsInt64)intUnion.i32; + *bufferLen = 2; + break; + + case dataTypeUInt32BEBS: + isUnsigned = true; + case dataTypeInt32BEBS: + intUnion.ui16[w32_1] = bswap16(data_[offset]); + intUnion.ui16[w32_0] = bswap16(data_[offset+1]); + i64Result = isUnsigned ? (epicsInt64)intUnion.ui32 : (epicsInt64)intUnion.i32; + *bufferLen = 2; + break; + + case dataTypeUInt64LE: + isUnsigned = true; + case dataTypeInt64LE: + intUnion.ui16[w64_0] = data_[offset]; + intUnion.ui16[w64_1] = data_[offset+1]; + intUnion.ui16[w64_2] = data_[offset+2]; + intUnion.ui16[w64_3] = data_[offset+3]; + i64Result = isUnsigned ? intUnion.ui64 : intUnion.i64; + *bufferLen = 4; + break; + + case dataTypeUInt64LEBS: + isUnsigned = true; + case dataTypeInt64LEBS: + intUnion.ui16[w64_0] = bswap16(data_[offset]); + intUnion.ui16[w64_1] = bswap16(data_[offset+1]); + intUnion.ui16[w64_2] = bswap16(data_[offset+2]); + intUnion.ui16[w64_3] = bswap16(data_[offset+3]); + i64Result = isUnsigned ? intUnion.ui64 : intUnion.i64; + *bufferLen = 4; + break; + + case dataTypeUInt64BE: + isUnsigned = true; + case dataTypeInt64BE: + intUnion.ui16[w64_3] = data_[offset]; + intUnion.ui16[w64_2] = data_[offset+1]; + intUnion.ui16[w64_1] = data_[offset+2]; + intUnion.ui16[w64_0] = data_[offset+3]; + i64Result = isUnsigned ? intUnion.ui64 : intUnion.i64; + *bufferLen = 4; + break; + + case dataTypeUInt64BEBS: + isUnsigned = true; + case dataTypeInt64BEBS: + intUnion.ui16[w64_3] = bswap16(data_[offset]); + intUnion.ui16[w64_2] = bswap16(data_[offset+1]); + intUnion.ui16[w64_1] = bswap16(data_[offset+2]); + intUnion.ui16[w64_0] = bswap16(data_[offset+3]); + i64Result = isUnsigned ? intUnion.ui64 : intUnion.i64; + *bufferLen = 4; + break; + + case dataTypeFloat32LE: + case dataTypeFloat32LEBS: + case dataTypeFloat32BE: + case dataTypeFloat32BEBS: + case dataTypeFloat64LE: + case dataTypeFloat64LEBS: + case dataTypeFloat64BE: + case dataTypeFloat64BEBS: + status = readPlcFloat(dataType, offset, &fValue, bufferLen); + i64Result = (epicsInt32)fValue; + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unknown data type %d\n", + driverName, functionName, this->portName, dataType); + status = asynError; + } + *output = i64Result; + return status; +} + +asynStatus drvModbusAsyn::writePlcInt32(modbusDataType_t dataType, int offset, epicsInt32 value, epicsUInt16 *buffer, int *bufferLen) +{ + return writePlcInt64(dataType, offset, (epicsInt64)value, buffer, bufferLen); +} + +asynStatus drvModbusAsyn::writePlcInt64(modbusDataType_t dataType, int offset, epicsInt64 value, epicsUInt16 *buffer, int *bufferLen) +{ + union { + epicsInt32 i32; + epicsUInt32 ui32; + epicsInt64 i64; + epicsUInt64 ui64; + epicsUInt16 ui16[4]; + } intUnion; + asynStatus status = asynSuccess; + /* Default to little-endian */ + int w32_0=0, w32_1=1, w64_0=0, w64_1=1, w64_2=2, w64_3=3; + if (EPICS_FLOAT_WORD_ORDER == EPICS_ENDIAN_BIG){ + w32_0=1; w32_1=0; w64_0=3; w64_1=2; w64_2=1; w64_3=0; + } + epicsUInt16 ui16Value=0; + int i; + int signMask = 0x8000; + int div=1000; + int digit; + int negative = 0; + bool isUnsigned = false; + static const char *functionName="writePlcInt64"; + + *bufferLen = 1; + switch (dataType) { + case dataTypeUInt16: + buffer[0] = (epicsUInt16)value; + break; + + case dataTypeInt16SM: + ui16Value = (epicsUInt16)value; + if (ui16Value & signMask) { + ui16Value = -(short)ui16Value; + ui16Value |= signMask; + } + buffer[0] = ui16Value; + break; + + case dataTypeBCDSigned: + if ((epicsInt16)value < 0) { + negative=1; + value = -(epicsInt16)value; + } /* Note: no break here */ + case dataTypeBCDUnsigned: + for (i=0; i<4; i++) { + ui16Value = ui16Value << 4; + digit = (int)value / div; + ui16Value |= digit; + value = value - digit*div; + div = div/10; + } + if (negative) ui16Value |= signMask; + buffer[0] = ui16Value; + break; + + case dataTypeInt16: + buffer[0] = (epicsInt16)value; + break; + + case dataTypeUInt32LE: + isUnsigned = true; + case dataTypeInt32LE: + *bufferLen = 2; + if (isUnsigned) intUnion.ui32 = (epicsUInt32)value; else intUnion.i32 = (epicsInt32)value; + buffer[0] = intUnion.ui16[w32_0]; + buffer[1] = intUnion.ui16[w32_1]; + break; + + case dataTypeUInt32LEBS: + isUnsigned = true; + case dataTypeInt32LEBS: + *bufferLen = 2; + if (isUnsigned) intUnion.ui32 = (epicsUInt32)value; else intUnion.i32 = (epicsInt32)value; + buffer[0] = bswap16(intUnion.ui16[w32_0]); + buffer[1] = bswap16(intUnion.ui16[w32_1]); + break; + + case dataTypeUInt32BE: + isUnsigned = true; + case dataTypeInt32BE: + *bufferLen = 2; + if (isUnsigned) intUnion.ui32 = (epicsUInt32)value; else intUnion.i32 = (epicsInt32)value; + buffer[0] = intUnion.ui16[w32_1]; + buffer[1] = intUnion.ui16[w32_0]; + break; + + case dataTypeUInt32BEBS: + isUnsigned = true; + case dataTypeInt32BEBS: + *bufferLen = 2; + if (isUnsigned) intUnion.ui32 = (epicsUInt32)value; else intUnion.i32 = (epicsInt32)value; + buffer[0] = bswap16(intUnion.ui16[w32_1]); + buffer[1] = bswap16(intUnion.ui16[w32_0]); + break; + + case dataTypeUInt64LE: + isUnsigned = true; + case dataTypeInt64LE: + *bufferLen = 4; + if (isUnsigned) intUnion.ui64 = (epicsUInt64)value; else intUnion.i64 = (epicsInt64)value; + buffer[0] = intUnion.ui16[w64_0]; + buffer[1] = intUnion.ui16[w64_1]; + buffer[2] = intUnion.ui16[w64_2]; + buffer[3] = intUnion.ui16[w64_3]; + break; + + case dataTypeUInt64LEBS: + isUnsigned = true; + case dataTypeInt64LEBS: + *bufferLen = 4; + if (isUnsigned) intUnion.ui64 = (epicsUInt64)value; else intUnion.i64 = (epicsInt64)value; + buffer[0] = bswap16(intUnion.ui16[w64_0]); + buffer[1] = bswap16(intUnion.ui16[w64_1]); + buffer[2] = bswap16(intUnion.ui16[w64_2]); + buffer[3] = bswap16(intUnion.ui16[w64_3]); + break; + + case dataTypeUInt64BE: + isUnsigned = true; + case dataTypeInt64BE: + *bufferLen = 4; + if (isUnsigned) intUnion.ui64 = (epicsUInt64)value; else intUnion.i64 = (epicsInt64)value; + buffer[0] = intUnion.ui16[w64_3]; + buffer[1] = intUnion.ui16[w64_2]; + buffer[2] = intUnion.ui16[w64_1]; + buffer[3] = intUnion.ui16[w64_0]; + break; + + case dataTypeUInt64BEBS: + isUnsigned = true; + case dataTypeInt64BEBS: + *bufferLen = 4; + if (isUnsigned) intUnion.ui64 = (epicsUInt64)value; else intUnion.i64 = (epicsInt64)value; + buffer[0] = bswap16(intUnion.ui16[w64_3]); + buffer[1] = bswap16(intUnion.ui16[w64_2]); + buffer[2] = bswap16(intUnion.ui16[w64_1]); + buffer[3] = bswap16(intUnion.ui16[w64_0]); + break; + + case dataTypeFloat32LE: + case dataTypeFloat32LEBS: + case dataTypeFloat32BE: + case dataTypeFloat32BEBS: + case dataTypeFloat64LE: + case dataTypeFloat64LEBS: + case dataTypeFloat64BE: + case dataTypeFloat64BEBS: + status = writePlcFloat(dataType, offset, (epicsFloat64)value, buffer, bufferLen); + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unknown data type %d\n", + driverName, functionName, this->portName, dataType); + status = asynError; + } + + return status; +} + +asynStatus drvModbusAsyn::readPlcFloat(modbusDataType_t dataType, int offset, epicsFloat64 *output, int *bufferLen) +{ + union { + epicsFloat32 f32; + epicsFloat64 f64; + epicsUInt16 ui16[4]; + } uIntFloat; + epicsInt32 i32Value; + epicsInt64 i64Value; + asynStatus status = asynSuccess; + /* Default to little-endian */ + int w32_0=0, w32_1=1, w64_0=0, w64_1=1, w64_2=2, w64_3=3; + if (EPICS_FLOAT_WORD_ORDER == EPICS_ENDIAN_BIG){ + w32_0=1; w32_1=0; w64_0=3; w64_1=2; w64_2=1; w64_3=0; + } + static const char *functionName="readPlcFloat"; + + switch (dataType) { + case dataTypeUInt16: + case dataTypeInt16SM: + case dataTypeBCDSigned: + case dataTypeBCDUnsigned: + case dataTypeInt16: + case dataTypeInt32LE: + case dataTypeInt32LEBS: + case dataTypeInt32BE: + case dataTypeInt32BEBS: + status = readPlcInt32(dataType, offset, &i32Value, bufferLen); + *output = (epicsFloat64)i32Value; + break; + + case dataTypeUInt32LE: + case dataTypeUInt32LEBS: + case dataTypeUInt32BE: + case dataTypeUInt32BEBS: + status = readPlcInt64(dataType, offset, &i64Value, bufferLen); + *output = (epicsFloat64)((epicsUInt32)i64Value); + break; + + case dataTypeInt64LE: + case dataTypeInt64LEBS: + case dataTypeInt64BE: + case dataTypeInt64BEBS: + status = readPlcInt64(dataType, offset, &i64Value, bufferLen); + *output = (epicsFloat64)i64Value; + break; + + case dataTypeUInt64LE: + case dataTypeUInt64LEBS: + case dataTypeUInt64BE: + case dataTypeUInt64BEBS: + status = readPlcInt64(dataType, offset, &i64Value, bufferLen); + *output = (epicsFloat64)((epicsUInt64)i64Value); + break; + + case dataTypeFloat32LE: + uIntFloat.ui16[w32_0] = data_[offset]; + uIntFloat.ui16[w32_1] = data_[offset+1]; + *output = (epicsFloat64)uIntFloat.f32; + *bufferLen = 2; + break; + + case dataTypeFloat32LEBS: + uIntFloat.ui16[w32_0] = bswap16(data_[offset]); + uIntFloat.ui16[w32_1] = bswap16(data_[offset+1]); + *output = (epicsFloat64)uIntFloat.f32; + *bufferLen = 2; + break; + case dataTypeFloat32BE: + uIntFloat.ui16[w32_1] = data_[offset]; + uIntFloat.ui16[w32_0] = data_[offset+1]; + *output = (epicsFloat64)uIntFloat.f32; + *bufferLen = 2; + break; + + case dataTypeFloat32BEBS: + uIntFloat.ui16[w32_1] = bswap16(data_[offset]); + uIntFloat.ui16[w32_0] = bswap16(data_[offset+1]); + *output = (epicsFloat64)uIntFloat.f32; + *bufferLen = 2; + break; + + case dataTypeFloat64LE: + uIntFloat.ui16[w64_0] = data_[offset]; + uIntFloat.ui16[w64_1] = data_[offset+1]; + uIntFloat.ui16[w64_2] = data_[offset+2]; + uIntFloat.ui16[w64_3] = data_[offset+3]; + *output = (epicsFloat64)uIntFloat.f64; + *bufferLen = 4; + break; + + case dataTypeFloat64LEBS: + uIntFloat.ui16[w64_0] = bswap16(data_[offset]); + uIntFloat.ui16[w64_1] = bswap16(data_[offset+1]); + uIntFloat.ui16[w64_2] = bswap16(data_[offset+2]); + uIntFloat.ui16[w64_3] = bswap16(data_[offset+3]); + *output = (epicsFloat64)uIntFloat.f64; + *bufferLen = 4; + break; + + case dataTypeFloat64BE: + uIntFloat.ui16[w64_3] = data_[offset]; + uIntFloat.ui16[w64_2] = data_[offset+1]; + uIntFloat.ui16[w64_1] = data_[offset+2]; + uIntFloat.ui16[w64_0] = data_[offset+3]; + *output = (epicsFloat64)uIntFloat.f64; + *bufferLen = 4; + break; + + case dataTypeFloat64BEBS: + uIntFloat.ui16[w64_3] = bswap16(data_[offset]); + uIntFloat.ui16[w64_2] = bswap16(data_[offset+1]); + uIntFloat.ui16[w64_1] = bswap16(data_[offset+2]); + uIntFloat.ui16[w64_0] = bswap16(data_[offset+3]); + *output = (epicsFloat64)uIntFloat.f64; + *bufferLen = 4; + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unknown data type %d\n", + driverName, functionName, this->portName, dataType); + status = asynError; + } + return status; +} + + +asynStatus drvModbusAsyn::writePlcFloat(modbusDataType_t dataType, int offset, epicsFloat64 value, epicsUInt16 *buffer, int *bufferLen) +{ + union { + epicsFloat32 f32; + epicsFloat64 f64; + epicsUInt16 ui16[4]; + } uIntFloat; + asynStatus status = asynSuccess; + /* Default to little-endian */ + int w32_0=0, w32_1=1, w64_0=0, w64_1=1, w64_2=2, w64_3=3; + if (EPICS_FLOAT_WORD_ORDER == EPICS_ENDIAN_BIG){ + w32_0=1; w32_1=0; w64_0=3; w64_1=2; w64_2=1; w64_3=0; + } + static const char *functionName="writePlcFloat"; + + switch (dataType) { + case dataTypeUInt16: + case dataTypeInt16SM: + case dataTypeBCDSigned: + case dataTypeBCDUnsigned: + case dataTypeInt16: + case dataTypeInt32LE: + case dataTypeInt32LEBS: + case dataTypeInt32BE: + case dataTypeInt32BEBS: + status = writePlcInt64(dataType, offset, (epicsInt64)value, buffer, bufferLen); + break; + + case dataTypeUInt32LE: + case dataTypeUInt32LEBS: + case dataTypeUInt32BE: + case dataTypeUInt32BEBS: + status = writePlcInt64(dataType, offset, (epicsUInt64)value, buffer, bufferLen); + break; + + case dataTypeInt64LE: + case dataTypeInt64LEBS: + case dataTypeInt64BE: + case dataTypeInt64BEBS: + status = writePlcInt64(dataType, offset, (epicsInt64)value, buffer, bufferLen); + break; + + case dataTypeUInt64LE: + case dataTypeUInt64LEBS: + case dataTypeUInt64BE: + case dataTypeUInt64BEBS: + status = writePlcInt64(dataType, offset, (epicsUInt64)value, buffer, bufferLen); + break; + + case dataTypeFloat32LE: + *bufferLen = 2; + uIntFloat.f32 = (epicsFloat32)value; + buffer[0] = uIntFloat.ui16[w32_0]; + buffer[1] = uIntFloat.ui16[w32_1]; + break; + + case dataTypeFloat32LEBS: + *bufferLen = 2; + uIntFloat.f32 = (epicsFloat32)value; + buffer[0] = bswap16(uIntFloat.ui16[w32_0]); + buffer[1] = bswap16(uIntFloat.ui16[w32_1]); + break; + + case dataTypeFloat32BE: + *bufferLen = 2; + uIntFloat.f32 = (epicsFloat32)value; + buffer[0] = uIntFloat.ui16[w32_1]; + buffer[1] = uIntFloat.ui16[w32_0]; + break; + + case dataTypeFloat32BEBS: + *bufferLen = 2; + uIntFloat.f32 = (epicsFloat32)value; + buffer[0] = bswap16(uIntFloat.ui16[w32_1]); + buffer[1] = bswap16(uIntFloat.ui16[w32_0]); + break; + + case dataTypeFloat64LE: + *bufferLen = 4; + uIntFloat.f64 = value; + buffer[0] = uIntFloat.ui16[w64_0]; + buffer[1] = uIntFloat.ui16[w64_1]; + buffer[2] = uIntFloat.ui16[w64_2]; + buffer[3] = uIntFloat.ui16[w64_3]; + break; + + case dataTypeFloat64LEBS: + *bufferLen = 4; + uIntFloat.f64 = value; + buffer[0] = bswap16(uIntFloat.ui16[w64_0]); + buffer[1] = bswap16(uIntFloat.ui16[w64_1]); + buffer[2] = bswap16(uIntFloat.ui16[w64_2]); + buffer[3] = bswap16(uIntFloat.ui16[w64_3]); + break; + + case dataTypeFloat64BE: + *bufferLen = 4; + uIntFloat.f64 = value; + buffer[0] = uIntFloat.ui16[w64_3]; + buffer[1] = uIntFloat.ui16[w64_2]; + buffer[2] = uIntFloat.ui16[w64_1]; + buffer[3] = uIntFloat.ui16[w64_0]; + break; + + case dataTypeFloat64BEBS: + *bufferLen = 4; + uIntFloat.f64 = value; + buffer[0] = bswap16(uIntFloat.ui16[w64_3]); + buffer[1] = bswap16(uIntFloat.ui16[w64_2]); + buffer[2] = bswap16(uIntFloat.ui16[w64_1]); + buffer[3] = bswap16(uIntFloat.ui16[w64_0]); + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unsupported data type %d\n", + driverName, functionName, this->portName, dataType); + status = asynError; + } + return status; +} + +asynStatus drvModbusAsyn::readPlcString(modbusDataType_t dataType, int offset, + char *data, size_t maxChars, int *bufferLen) +{ + size_t i; + asynStatus status = asynSuccess; + static const char *functionName="readPlcString"; + + for (i=0; i> 8) & 0x00ff; + break; + + case dataTypeStringLow: + case dataTypeZStringLow: + data[i] = data_[offset] & 0x00ff; + break; + + case dataTypeStringHighLow: + case dataTypeZStringHighLow: + data[i] = (data_[offset] >> 8) & 0x00ff; + if (i> 8) & 0x00ff; + } + break; + + default: + asynPrint(pasynUserSelf, ASYN_TRACE_ERROR, + "%s::%s, port %s unknown data type %d\n", + driverName, functionName, this->portName, dataType); + status = asynError; + } + } + /* Nil terminate and set number of characters to include trailing nil */ + if (i >= maxChars) { + i = maxChars-1; + } + data[i] = 0; + *bufferLen = (int)(strlen(data) + 1); + return status; +} + +asynStatus drvModbusAsyn::writePlcString(modbusDataType_t dataType, int offset, + const char *data, size_t maxChars, size_t *nActual, int *bufferLen) +{ + size_t i; + asynStatus status = asynSuccess; + static const char *functionName="writePlcString"; + + for (i=0, *bufferLen=0, *nActual=0; iportName, dataType); + status = asynError; + } + *nActual = i + 1; + (*bufferLen)++; + } + return status; +} + +extern "C" { +/* +** drvModbusAsynConfigure() - create and init an asyn port driver for a PLC +** +*/ + +/** EPICS iocsh callable function to call constructor for the drvModbusAsyn class. */ +asynStatus drvModbusAsynConfigure(const char *portName, const char *octetPortName, + int modbusSlave, int modbusFunction, + int modbusStartAddress, int modbusLength, + const char *dataTypeString, + int pollMsec, + char *plcType) +{ + int dataType = -1; + // The datatype can either be specified as a number (modbusDataType_t enum), + // or a string like INT32_LE. + if (isdigit(dataTypeString[0])) { + dataType = atoi(dataTypeString); + } else { + int i; + for (i=0; i +#include + +#include +#include "modbus.h" + +/* These are the strings that device support passes to drivers via * the asynDrvUser interface. - * Drivers must return a value in pasynUser->reason that is unique + * Drivers must return a value in pasynUser->reason that is unique * for that command. */ -#define MODBUS_DATA_STRING "MODBUS_DATA" -#define MODBUS_READ_STRING "MODBUS_READ" -#define MODBUS_UINT16_STRING "UINT16" -#define MODBUS_INT16_SM_STRING "INT16SM" -#define MODBUS_BCD_UNSIGNED_STRING "BCD_UNSIGNED" -#define MODBUS_BCD_SIGNED_STRING "BCD_SIGNED" -#define MODBUS_INT16_STRING "INT16" -#define MODBUS_INT32_LE_STRING "INT32_LE" -#define MODBUS_INT32_BE_STRING "INT32_BE" -#define MODBUS_FLOAT32_LE_STRING "FLOAT32_LE" -#define MODBUS_FLOAT32_BE_STRING "FLOAT32_BE" -#define MODBUS_FLOAT64_LE_STRING "FLOAT64_LE" -#define MODBUS_FLOAT64_BE_STRING "FLOAT64_BE" -#define MODBUS_STRING_HIGH_STRING "STRING_HIGH" -#define MODBUS_STRING_LOW_STRING "STRING_LOW" -#define MODBUS_STRING_HIGH_LOW_STRING "STRING_HIGH_LOW" -#define MODBUS_STRING_LOW_HIGH_STRING "STRING_LOW_HIGH" -#define MODBUS_ENABLE_HISTOGRAM_STRING "ENABLE_HISTOGRAM" -#define MODBUS_READ_HISTOGRAM_STRING "READ_HISTOGRAM" +// These are the parameters we register with asynPortDriver +#define MODBUS_DATA_STRING "MODBUS_DATA" +#define MODBUS_READ_STRING "MODBUS_READ" +#define MODBUS_ENABLE_HISTOGRAM_STRING "ENABLE_HISTOGRAM" +#define MODBUS_READ_HISTOGRAM_STRING "READ_HISTOGRAM" #define MODBUS_HISTOGRAM_BIN_TIME_STRING "HISTOGRAM_BIN_TIME" #define MODBUS_HISTOGRAM_TIME_AXIS_STRING "HISTOGRAM_TIME_AXIS" -#define MODBUS_POLL_DELAY_STRING "POLL_DELAY" -#define MODBUS_READ_OK_STRING "READ_OK" -#define MODBUS_WRITE_OK_STRING "WRITE_OK" -#define MODBUS_IO_ERRORS_STRING "IO_ERRORS" -#define MODBUS_LAST_IO_TIME_STRING "LAST_IO_TIME" -#define MODBUS_MAX_IO_TIME_STRING "MAX_IO_TIME" +#define MODBUS_POLL_DELAY_STRING "POLL_DELAY" +#define MODBUS_READ_OK_STRING "READ_OK" +#define MODBUS_WRITE_OK_STRING "WRITE_OK" +#define MODBUS_IO_ERRORS_STRING "IO_ERRORS" +#define MODBUS_LAST_IO_TIME_STRING "LAST_IO_TIME" +#define MODBUS_MAX_IO_TIME_STRING "MAX_IO_TIME" + +// These are the data type strings that are used in the drvUser parameter +// They are not registered with asynPortDriver +#define MODBUS_INT16_STRING "INT16" +#define MODBUS_INT16_SM_STRING "INT16SM" +#define MODBUS_BCD_UNSIGNED_STRING "BCD_UNSIGNED" +#define MODBUS_BCD_SIGNED_STRING "BCD_SIGNED" +#define MODBUS_UINT16_STRING "UINT16" +#define MODBUS_INT32_LE_STRING "INT32_LE" +#define MODBUS_INT32_LE_BS_STRING "INT32_LE_BS" +#define MODBUS_INT32_BE_STRING "INT32_BE" +#define MODBUS_INT32_BE_BS_STRING "INT32_BE_BS" +#define MODBUS_UINT32_LE_STRING "UINT32_LE" +#define MODBUS_UINT32_LE_BS_STRING "UINT32_LE_BS" +#define MODBUS_UINT32_BE_STRING "UINT32_BE" +#define MODBUS_UINT32_BE_BS_STRING "UINT32_BE_BS" +#define MODBUS_INT64_LE_STRING "INT64_LE" +#define MODBUS_INT64_LE_BS_STRING "INT64_LE_BS" +#define MODBUS_INT64_BE_STRING "INT64_BE" +#define MODBUS_INT64_BE_BS_STRING "INT64_BE_BS" +#define MODBUS_UINT64_LE_STRING "UINT64_LE" +#define MODBUS_UINT64_LE_BS_STRING "UINT64_LE_BS" +#define MODBUS_UINT64_BE_STRING "UINT64_BE" +#define MODBUS_UINT64_BE_BS_STRING "UINT64_BE_BS" +#define MODBUS_FLOAT32_LE_STRING "FLOAT32_LE" +#define MODBUS_FLOAT32_LE_BS_STRING "FLOAT32_LE_BS" +#define MODBUS_FLOAT32_BE_STRING "FLOAT32_BE" +#define MODBUS_FLOAT32_BE_BS_STRING "FLOAT32_BE_BS" +#define MODBUS_FLOAT64_LE_STRING "FLOAT64_LE" +#define MODBUS_FLOAT64_LE_BS_STRING "FLOAT64_LE_BS" +#define MODBUS_FLOAT64_BE_STRING "FLOAT64_BE" +#define MODBUS_FLOAT64_BE_BS_STRING "FLOAT64_BE_BS" +#define MODBUS_STRING_HIGH_STRING "STRING_HIGH" +#define MODBUS_STRING_LOW_STRING "STRING_LOW" +#define MODBUS_STRING_HIGH_LOW_STRING "STRING_HIGH_LOW" +#define MODBUS_STRING_LOW_HIGH_STRING "STRING_LOW_HIGH" +#define MODBUS_ZSTRING_HIGH_STRING "ZSTRING_HIGH" +#define MODBUS_ZSTRING_LOW_STRING "ZSTRING_LOW" +#define MODBUS_ZSTRING_HIGH_LOW_STRING "ZSTRING_HIGH_LOW" +#define MODBUS_ZSTRING_LOW_HIGH_STRING "ZSTRING_LOW_HIGH" + +#define HISTOGRAM_LENGTH 200 /* Length of time histogram */ typedef enum { - dataTypeUInt16, /* 16-bit unsigned drvUser=UINT16 */ - dataTypeInt16SM, /* 16-bit sign and magnitude drvUser=INT16SM */ - dataTypeBCDUnsigned, /* 16-bit unsigned BCD drvUser=BCD_SIGNED */ - dataTypeBCDSigned, /* 16-bit signed BCD drvUser=BCD_UNSIGNED */ - dataTypeInt16, /* 16-bit 2's complement drvUser=INT16 */ - dataTypeInt32LE, /* 32-bit integer little-endian drvUser=INT32_LE */ - dataTypeInt32BE, /* 32-bit integer big-endian drvUser=INT32_BE */ - dataTypeFloat32LE, /* 32-bit float little-endian drvuser=FLOAT32_LE */ - dataTypeFloat32BE, /* 32-bit float big-endian drvUser=FLOAT32_BE */ - dataTypeFloat64LE, /* 64-bit float little-endian drvuser=FLOAT64_LE */ - dataTypeFloat64BE, /* 64-bit float big-endian drvUser=FLOAT64_BE */ - dataTypeStringHigh, /* String, high byte of each word drvUser=STRING_HIGH */ - dataTypeStringLow, /* String, low byte of each word drvUser=STRING_LOW*/ - dataTypeStringHighLow, /* String, high then low byte of each word drvUser=STRING_HIGH_LOW */ - dataTypeStringLowHigh /* String, low then high byte of each word drvUser=STRING_LOW_HIGH*/ + dataTypeInt16, + dataTypeInt16SM, + dataTypeBCDUnsigned, + dataTypeBCDSigned, + dataTypeUInt16, + dataTypeInt32LE, + dataTypeInt32LEBS, + dataTypeInt32BE, + dataTypeInt32BEBS, + dataTypeUInt32LE, + dataTypeUInt32LEBS, + dataTypeUInt32BE, + dataTypeUInt32BEBS, + dataTypeInt64LE, + dataTypeInt64LEBS, + dataTypeInt64BE, + dataTypeInt64BEBS, + dataTypeUInt64LE, + dataTypeUInt64LEBS, + dataTypeUInt64BE, + dataTypeUInt64BEBS, + dataTypeFloat32LE, + dataTypeFloat32LEBS, + dataTypeFloat32BE, + dataTypeFloat32BEBS, + dataTypeFloat64LE, + dataTypeFloat64LEBS, + dataTypeFloat64BE, + dataTypeFloat64BEBS, + dataTypeStringHigh, + dataTypeStringLow, + dataTypeStringHighLow, + dataTypeStringLowHigh, + dataTypeZStringHigh, + dataTypeZStringLow, + dataTypeZStringHighLow, + dataTypeZStringLowHigh, + MAX_MODBUS_DATA_TYPES } modbusDataType_t; -#define MAX_MODBUS_DATA_TYPES 15 +struct modbusDrvUser_t; + +class epicsShareClass drvModbusAsyn : public asynPortDriver { +public: + drvModbusAsyn(const char *portName, const char *octetPortName, + int modbusSlave, int modbusFunction, + int modbusStartAddress, int modbusLength, + modbusDataType_t dataType, + int pollMsec, + const char *plcType); + + /* These are the methods that we override from asynPortDriver */ + + /* These functions are in the asynCommon interface */ + virtual void report(FILE *fp, int details); + virtual asynStatus connect(asynUser *pasynUser); + virtual asynStatus getAddress(asynUser *pasynUser, int *address); + + /* These functions are in the asynDrvUser interface */ + virtual asynStatus drvUserCreate(asynUser *pasynUser, const char *drvInfo, const char **pptypeName, size_t *psize); + virtual asynStatus drvUserDestroy(asynUser *pasynUser); + + /* These functions are in the asynUInt32Digital interface */ + virtual asynStatus writeUInt32Digital(asynUser *pasynUser, epicsUInt32 value, epicsUInt32 mask); + virtual asynStatus readUInt32Digital(asynUser *pasynUser, epicsUInt32 *value, epicsUInt32 mask); + + /* These functions are in the asynInt32 interface */ + virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); + virtual asynStatus readInt32(asynUser *pasynUser, epicsInt32 *value); + + /* These functions are in the asynInt64 interface */ + virtual asynStatus writeInt64(asynUser *pasynUser, epicsInt64 value); + virtual asynStatus readInt64(asynUser *pasynUser, epicsInt64 *value); + + /* These functions are in the asynFloat64 interface */ + virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); + virtual asynStatus readFloat64(asynUser *pasynUser, epicsFloat64 *value); + + /* These functions are in the asynInt32Array interface */ + virtual asynStatus readInt32Array(asynUser *pasynUser, epicsInt32 *data, size_t maxChans, size_t *nactual); + virtual asynStatus writeInt32Array(asynUser *pasynUser, epicsInt32 *data, size_t maxChans); + + /* These functions are in the asynOctet interface */ + virtual asynStatus writeOctet(asynUser *pasynUser, const char *value, size_t maxChars, size_t *nActual); + virtual asynStatus readOctet(asynUser *pasynUser, char *value, size_t maxChars, size_t *nActual, int *eomReason); + + /* These are the methods that are new to this class */ + void readPoller(); + modbusDataType_t getDataType(asynUser *pasynUser); + int getStringLen(asynUser *pasynUser, size_t maxChars); + bool isZeroTerminatedString(modbusDataType_t dataType); + asynStatus checkOffset(int offset); + asynStatus checkModbusFunction(int *modbusFunction); + asynStatus doModbusIO(int slave, int function, int start, epicsUInt16 *data, int len); + asynStatus readPlcInt32(modbusDataType_t dataType, int offset, epicsInt32 *value, int *bufferLen); + asynStatus writePlcInt32(modbusDataType_t dataType, int offset, epicsInt32 value, epicsUInt16 *buffer, int *bufferLen); + asynStatus readPlcInt64(modbusDataType_t dataType, int offset, epicsInt64 *value, int *bufferLen); + asynStatus writePlcInt64(modbusDataType_t dataType, int offset, epicsInt64 value, epicsUInt16 *buffer, int *bufferLen); + asynStatus readPlcFloat(modbusDataType_t dataType, int offset, epicsFloat64 *value, int *bufferLen); + asynStatus writePlcFloat(modbusDataType_t dataType, int offset, epicsFloat64 value, epicsUInt16 *buffer, int *bufferLen); + asynStatus readPlcString (modbusDataType_t dataType, int offset, char *value, size_t maxChars, int *bufferLen); + asynStatus writePlcString(modbusDataType_t dataType, int offset, const char *value, size_t maxChars, size_t *nActual, int *bufferLen); + bool modbusExiting_; + +protected: + /** Values used for pasynUser->reason, and indexes into the parameter library. */ + int P_Data; + int P_Read; + int P_EnableHistogram; + int P_ReadHistogram; + int P_HistogramBinTime; + int P_HistogramTimeAxis; + int P_PollDelay; + int P_ReadOK; + int P_WriteOK; + int P_IOErrors; + int P_LastIOTime; + int P_MaxIOTime; +private: + /* Our data */ + bool initialized_; /* If initialized successfully */ + char *octetPortName_; /* asyn port name for the asyn octet port */ + char *plcType_; /* String describing PLC type */ + bool isConnected_; /* Connection status */ + asynStatus ioStatus_; /* I/O error status */ + asynStatus prevIOStatus_; /* Previous I/O error status */ + asynUser *pasynUserOctet_; /* asynUser for asynOctet interface to asyn octet port */ + asynUser *pasynUserCommon_; /* asynUser for asynCommon interface to asyn octet port */ + asynUser *pasynUserTrace_; /* asynUser for asynTrace on this port */ + int modbusSlave_; /* Modbus slave address */ + int modbusFunction_; /* Modbus function code */ + int modbusStartAddress_; /* Modbus starting addess for this port */ + int modbusLength_; /* Number of words or bits of Modbus data */ + bool absoluteAddressing_; /* Address from asyn are absolute, rather than relative to modbusStartAddress */ + modbusDataType_t dataType_; /* Data type */ + modbusDrvUser_t *drvUser_; /* Drv user structure */ + epicsUInt16 *data_; /* Memory buffer */ + char modbusRequest_[MAX_MODBUS_FRAME_SIZE]; /* Modbus request message */ + char modbusReply_[MAX_MODBUS_FRAME_SIZE]; /* Modbus reply message */ + double pollDelay_; /* Delay for readPoller */ + epicsThreadId readPollerThreadId_; + epicsEventId readPollerEventId_; + bool forceCallback_; + int readOnceFunction_; + bool readOnceDone_; + int readOK_; + int writeOK_; + int IOErrors_; + int currentIOErrors_; /* IO Errors since last successful writeRead cycle */ + int maxIOMsec_; + int lastIOMsec_; + epicsInt32 timeHistogram_[HISTOGRAM_LENGTH]; /* Histogram of read-times */ + epicsInt32 histogramTimeAxis_[HISTOGRAM_LENGTH]; /* Time axis of histogram of read-times */ + bool enableHistogram_; + int histogramMsPerBin_; + int readbackOffset_; /* Readback offset for Wago devices */ +}; -int drvModbusAsynConfigure(char *portName, - char *octetPortName, - int modbusSlave, - int modbusFunction, - int modbusStartAddress, - int modbusLength, - modbusDataType_t dataType, - int pollMsec, - char *plcType); +#endif /* drvModbusAsyn_H */ diff --git a/modbusApp/src/modbusInclude.dbd b/modbusApp/src/modbusInclude.dbd deleted file mode 100644 index 6cef253..0000000 --- a/modbusApp/src/modbusInclude.dbd +++ /dev/null @@ -1,7 +0,0 @@ -include "base.dbd" -include "asyn.dbd" -include "drvAsynIPPort.dbd" -include "drvAsynSerialPort.dbd" -include "modbusSupport.dbd" -registrar(testModbusSyncIORegister) - diff --git a/modbusApp/src/modbusInterpose.c b/modbusApp/src/modbusInterpose.c index 56504f2..8ebb29a 100644 --- a/modbusApp/src/modbusInterpose.c +++ b/modbusApp/src/modbusInterpose.c @@ -26,9 +26,10 @@ #include #include "asynDriver.h" #include "asynOctet.h" + +#include #include "modbusInterpose.h" #include "modbus.h" -#include static char *driver="modbusInterpose"; @@ -231,7 +232,7 @@ static asynStatus writeIt(void *ppvt, asynUser *pasynUser, size_t nbytesActual = 0; size_t nWrite; modbusMBAPHeader mbapHeader; - unsigned short cmdLength = numchars; + unsigned short cmdLength = (unsigned short)numchars; unsigned short modbusEncoding=0; int mbapSize = sizeof(modbusMBAPHeader); unsigned char CRC_Hi; @@ -271,7 +272,7 @@ static asynStatus writeIt(void *ppvt, asynUser *pasynUser, /* Next is the Modbus data */ memcpy(pPvt->buffer, data, numchars); /* Compute the CRC */ - computeCRC(pPvt->buffer, numchars, &CRC_Lo, &CRC_Hi); + computeCRC(pPvt->buffer, (int)numchars, &CRC_Lo, &CRC_Hi); pPvt->buffer[numchars] = CRC_Lo; pPvt->buffer[numchars+1] = CRC_Hi; /* Send the frame with the underlying driver */ @@ -285,7 +286,7 @@ static asynStatus writeIt(void *ppvt, asynUser *pasynUser, case modbusLinkASCII: /* Put slave address and data in buffer to compute LRC */ memcpy(pPvt->buffer, data, numchars); - computeLRC(pPvt->buffer, numchars, &LRC); + computeLRC(pPvt->buffer, (int)numchars, &LRC); /* Now convert to ASCII */ /* First byte in the output is : */ pout = pPvt->buffer; @@ -340,7 +341,15 @@ static asynStatus readIt(void *ppvt, asynUser *pasynUser, status = pPvt->pasynOctet->read(pPvt->octetPvt, pasynUser, pPvt->buffer, nRead, &nbytesActual, eomReason); - if (status != asynSuccess) return status; + /* If the returned status is asynTimeout this can be because the interposeEOS + * interface is being used and we received fewer bytes than expected due to a Modbus exception. + * In this case nbytesActual will be 9 and buffer[7] will have the MODBUS_EXCEPTION_FCN bit set + * We want to return the data read in this case so the exception can be reported. */ + if ((nbytesActual == 9) && (pPvt->buffer[7] & MODBUS_EXCEPTION_FCN)) status = asynSuccess; + if (status != asynSuccess) { + *nbytesTransfered = nbytesActual; + return status; + } if (nbytesActual >= 2) { int id = ((pPvt->buffer[0] & 0xFF)<<8)|(pPvt->buffer[1]&0xFF); if (id == pPvt->transactionId) break; @@ -361,10 +370,13 @@ static asynStatus readIt(void *ppvt, asynUser *pasynUser, status = pPvt->pasynOctet->read(pPvt->octetPvt, pasynUser, pPvt->buffer, nRead, &nbytesActual, eomReason); - if (status != asynSuccess) return status; + if (status != asynSuccess) { + *nbytesTransfered = nbytesActual; + return status; + } /* Compute and check the CRC including the CRC bytes themselves, * should be 0 */ - computeCRC(pPvt->buffer, nbytesActual, &CRC_Lo, &CRC_Hi); + computeCRC(pPvt->buffer, (int)nbytesActual, &CRC_Lo, &CRC_Hi); if ((CRC_Lo != 0) || (CRC_Hi != 0)) { asynPrint(pasynUser, ASYN_TRACE_ERROR, "%s::readIt, CRC error\n", @@ -388,7 +400,10 @@ static asynStatus readIt(void *ppvt, asynUser *pasynUser, status = pPvt->pasynOctet->read(pPvt->octetPvt, pasynUser, pPvt->buffer, nRead, &nbytesActual, eomReason); - if (status != asynSuccess) return status; + if (status != asynSuccess) { + *nbytesTransfered = nbytesActual; + return status; + } pin = pPvt->buffer; if (*pin != ':') return asynError; pin += 1; @@ -398,7 +413,7 @@ static asynStatus readIt(void *ppvt, asynUser *pasynUser, } /* Number of bytes in buffer for computing LRC is i */ nRead = i; - computeLRC(data, nRead, &LRC); + computeLRC(data, (int)nRead, &LRC); if (LRC != data[i]) { asynPrint(pasynUser, ASYN_TRACE_ERROR, "%s::readIt, LRC error, nRead=%d, received LRC=0x%x, computed LRC=0x%x\n", diff --git a/modbusApp/src/modbusInterpose.h b/modbusApp/src/modbusInterpose.h index 55e9468..dd73cc3 100644 --- a/modbusApp/src/modbusInterpose.h +++ b/modbusApp/src/modbusInterpose.h @@ -9,7 +9,6 @@ #define modbusInterpose_H #include -#include typedef enum { modbusLinkTCP, diff --git a/modbusApp/src/testClient.cpp b/modbusApp/src/testClient.cpp new file mode 100644 index 0000000..52012d3 --- /dev/null +++ b/modbusApp/src/testClient.cpp @@ -0,0 +1,75 @@ +// This program tests creating a new drvModbusAsyn object and using it to do I/O using absolute addressing from +// a pure C++ program without an IOC. + +#include +#include + +#include + +#include +#include + +#include +#include + + +int main(int argc, char *argv[]) +{ + epicsUInt16 data[256]; + int i; + + /* Use the following commands for TCP/IP + * drvAsynIPPortConfigure(const char *portName, + * const char *hostInfo, + * unsigned int priority, + * int noAutoConnect, + * int noProcessEos); */ + drvAsynIPPortConfigure("Koyo1","camaro:502",0,0,0); + asynSetOption("Koyo1", 0, "disconnectOnReadTimeout", "Y"); + + /* modbusInterposeConfig(const char *portName, + * modbusLinkType linkType, + * int timeoutMsec, + * int writeDelayMsec) */ + modbusInterposeConfig("Koyo1", modbusLinkTCP, 5000, 0); + + /* drvModbusAsyn(const char *portName, const char *octetPortName, + * int modbusSlave, int modbusFunction, + * int modbusStartAddress, int modbusLength, + * modbusDataType_t dataType, + * int pollMsec, + * const char *plcType); */ + // Use absolute addressing, modbusStartAddress=-1. + drvModbusAsyn *pModbus = new drvModbusAsyn("K1", "Koyo1", 0, 2, -1, 256, dataTypeUInt16, 0, "Koyo"); + + // Write 10 bits at address 2048 + memset(data, 0, sizeof(data)); + data[0] = 1; + data[2] = 1; + data[4] = 1; + data[6] = 1; + data[8] = 1; + printf(" Writing [1 0 1 0 1 0 1 0 1 0] to adddress 2048\n"); + /* asynStatus doModbusIO(int slave, int function, int start, epicsUInt16 *data, int len); */ + pModbus->doModbusIO(0, MODBUS_WRITE_MULTIPLE_COILS, 2048, data, 10); + + // Read them back + memset(data, 0, sizeof(data)); + pModbus->doModbusIO(0, MODBUS_READ_COILS, 2048, data, 10); + printf("Read back ["); + for (i=0; i<10; i++) printf("%d ", data[i]); + printf("] from address 2048\n"); + + // Write 10 words at address 3072 + for (i=0; i<10; i++) data[i] = i; + printf(" Writing [0 1 2 3 4 5 6 7 8 9] to adddress 3072\n"); + pModbus->doModbusIO(0, MODBUS_WRITE_MULTIPLE_REGISTERS, 3072, data, 10); + + // Read them back + memset(data, 0, sizeof(data)); + pModbus->doModbusIO(0, MODBUS_READ_HOLDING_REGISTERS, 3072, data, 10); + printf("Read back ["); + for (i=0; i<10; i++) printf("%d ", data[i]); + printf("] from address 3072\n"); + +} \ No newline at end of file diff --git a/modbusApp/src/testModbusSyncIO.cpp b/modbusApp/src/testModbusSyncIO.cpp index 863db23..2b34799 100644 --- a/modbusApp/src/testModbusSyncIO.cpp +++ b/modbusApp/src/testModbusSyncIO.cpp @@ -40,9 +40,7 @@ class epicsShareClass testModbusSyncIO : public asynPortDriver { protected: /** Values used for pasynUser->reason, and indexes into the parameter library. */ int P_SyncIO_; - #define FIRST_COMMAND P_SyncIO_ int P_LockIO_; - #define LAST_COMMAND P_LockIO_ private: /* Our data */ @@ -57,15 +55,12 @@ class epicsShareClass testModbusSyncIO : public asynPortDriver { void *pasynInt32OutputPvt_; }; -#define NUM_PARAMS (&LAST_COMMAND - &FIRST_COMMAND + 1) - /** Constructor for the testModbusSyncIO class. * Calls constructor for the asynPortDriver base class. */ testModbusSyncIO::testModbusSyncIO(const char *portName, const char *inputDriver, const char* outputDriver) : asynPortDriver(portName, 1, /* maxAddr */ - (int)NUM_PARAMS, asynInt32Mask | asynDrvUserMask, /* Interface mask */ 0, /* Interrupt mask */ ASYN_CANBLOCK, /* asynFlags. This driver blocks and it is not multi-device*/