First commit

This commit is contained in:
jfmartel 2022-06-13 09:16:01 -04:00
commit 53d8a3fcc5
50 changed files with 14826 additions and 0 deletions

21
.qmake.stash Normal file
View File

@ -0,0 +1,21 @@
QMAKE_CXX.QT_COMPILER_STDCXX = 201402L
QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 7
QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 3
QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 0
QMAKE_CXX.COMPILER_MACROS = \
QT_COMPILER_STDCXX \
QMAKE_GCC_MAJOR_VERSION \
QMAKE_GCC_MINOR_VERSION \
QMAKE_GCC_PATCH_VERSION
QMAKE_CXX.INCDIRS = \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++ \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/x86_64-w64-mingw32 \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/backward \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include-fixed \
C:/Qt/Qt5.14.2/Tools/mingw730_64/x86_64-w64-mingw32/include
QMAKE_CXX.LIBDIRS = \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc/x86_64-w64-mingw32/7.3.0 \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib/gcc \
C:/Qt/Qt5.14.2/Tools/mingw730_64/x86_64-w64-mingw32/lib \
C:/Qt/Qt5.14.2/Tools/mingw730_64/lib

472
Makefile Normal file
View File

@ -0,0 +1,472 @@
#############################################################################
# Makefile for building: OutilModbus
# Generated by qmake (3.1) (Qt 5.14.2)
# Project: OutilModbus.pro
# Template: app
# Command: C:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\qmake.exe -o Makefile OutilModbus.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug"
#############################################################################
MAKEFILE = Makefile
EQ = =
first: debug
install: debug-install
uninstall: debug-uninstall
QMAKE = C:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\qmake.exe
DEL_FILE = del
CHK_DIR_EXISTS= if not exist
MKDIR = mkdir
COPY = copy /y
COPY_FILE = copy /y
COPY_DIR = xcopy /s /q /y /i
INSTALL_FILE = copy /y
INSTALL_PROGRAM = copy /y
INSTALL_DIR = xcopy /s /q /y /i
QINSTALL = C:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\qmake.exe -install qinstall
QINSTALL_PROGRAM = C:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\qmake.exe -install qinstall -exe
DEL_FILE = del
SYMLINK = $(QMAKE) -install ln -f -s
DEL_DIR = rmdir
MOVE = move
IDC = idc
IDL = midl
ZIP = zip -r -9
DEF_FILE =
RES_FILE =
SED = $(QMAKE) -install sed
MOVE = move
SUBTARGETS = \
debug \
release
debug: FORCE
$(MAKE) -f $(MAKEFILE).Debug
debug-make_first: FORCE
$(MAKE) -f $(MAKEFILE).Debug
debug-all: FORCE
$(MAKE) -f $(MAKEFILE).Debug all
debug-clean: FORCE
$(MAKE) -f $(MAKEFILE).Debug clean
debug-distclean: FORCE
$(MAKE) -f $(MAKEFILE).Debug distclean
debug-install: FORCE
$(MAKE) -f $(MAKEFILE).Debug install
debug-uninstall: FORCE
$(MAKE) -f $(MAKEFILE).Debug uninstall
release: FORCE
$(MAKE) -f $(MAKEFILE).Release
release-make_first: FORCE
$(MAKE) -f $(MAKEFILE).Release
release-all: FORCE
$(MAKE) -f $(MAKEFILE).Release all
release-clean: FORCE
$(MAKE) -f $(MAKEFILE).Release clean
release-distclean: FORCE
$(MAKE) -f $(MAKEFILE).Release distclean
release-install: FORCE
$(MAKE) -f $(MAKEFILE).Release install
release-uninstall: FORCE
$(MAKE) -f $(MAKEFILE).Release uninstall
Makefile: OutilModbus.pro C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/win32-g++/qmake.conf C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/spec_pre.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/qdevice.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/device_config.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/sanitize.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/gcc-base.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/g++-base.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/angle.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/windows_vulkan_sdk.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/windows-vulkan.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/g++-win32.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/windows-desktop.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/qconfig.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3danimation.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3danimation_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dcore.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dcore_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dextras.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dextras_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dinput.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dinput_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dlogic.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dlogic_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquick.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquick_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickanimation.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickextras.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickextras_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickinput.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickinput_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickrender.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickrender_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickscene2d.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3drender.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3drender_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_accessibility_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axbase.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axbase_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axcontainer.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axcontainer_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axserver.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axserver_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_bluetooth.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_bluetooth_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_bootstrap_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_concurrent.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_concurrent_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_core.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_core_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_dbus.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_dbus_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_designer.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_designer_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_designercomponents_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_edid_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_egl_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_fb_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gamepad.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gamepad_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gui.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gui_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_help.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_help_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_location.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_location_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimedia.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimedia_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimediawidgets.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_network.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_network_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_nfc.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_nfc_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_opengl.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_opengl_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_openglextensions.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_openglextensions_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_packetprotocol_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioning.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioning_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioningquick.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioningquick_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_printsupport.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_printsupport_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qml.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qml_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmldebug_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmldevtools_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlmodels.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlmodels_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmltest.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmltest_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlworkerscript.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quick.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quick_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickcontrols2.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickparticles_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickshapes_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quicktemplates2.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickwidgets.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickwidgets_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_remoteobjects.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_remoteobjects_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_repparser.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_repparser_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_scxml.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_scxml_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sensors.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sensors_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialbus.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialbus_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialport.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialport_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sql.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sql_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_svg.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_svg_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_testlib.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_testlib_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_texttospeech.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_texttospeech_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_theme_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_uiplugin.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_uitools.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_uitools_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_vulkan_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_webchannel.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_webchannel_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_websockets.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_websockets_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_widgets.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_widgets_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_windowsuiautomation_support_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_winextras.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_winextras_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xml.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xml_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xmlpatterns.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_zlib_private.pri \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qt_functions.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qt_config.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/win32-g++/qmake.conf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/spec_post.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/exclusive_builds.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/toolchain.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/default_pre.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/default_pre.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/resolve_config.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/exclusive_builds_post.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/default_post.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qml_debug.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/precompile_header.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/warn_on.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qt.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/resources_functions.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/resources.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/moc.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/opengl.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/uic.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qmake_use.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/file_copies.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/windows.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/testcase_targets.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/exceptions.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/yacc.prf \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/lex.prf \
OutilModbus.pro \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Widgets.prl \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Gui.prl \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Network.prl \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Core.prl \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/qtmain.prl \
.qmake.stash \
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/build_pass.prf
$(QMAKE) -o Makefile OutilModbus.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug"
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/spec_pre.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/qdevice.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/device_config.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/sanitize.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/gcc-base.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/g++-base.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/angle.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/windows_vulkan_sdk.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/windows-vulkan.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/g++-win32.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/common/windows-desktop.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/qconfig.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3danimation.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3danimation_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dcore.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dcore_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dextras.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dextras_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dinput.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dinput_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dlogic.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dlogic_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquick.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquick_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickanimation.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickanimation_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickextras.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickextras_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickinput.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickinput_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickrender.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickrender_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickscene2d.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3dquickscene2d_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3drender.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_3drender_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_accessibility_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axbase.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axbase_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axcontainer.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axcontainer_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axserver.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_axserver_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_bluetooth.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_bluetooth_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_bootstrap_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_concurrent.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_concurrent_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_core.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_core_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_dbus.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_dbus_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_designer.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_designer_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_designercomponents_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_devicediscovery_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_edid_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_egl_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_fb_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_fontdatabase_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gamepad.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gamepad_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gui.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_gui_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_help.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_help_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_location.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_location_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimedia.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimedia_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimediawidgets.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_multimediawidgets_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_network.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_network_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_nfc.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_nfc_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_opengl.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_opengl_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_openglextensions.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_openglextensions_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_packetprotocol_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_platformcompositor_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioning.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioning_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioningquick.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_positioningquick_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_printsupport.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_printsupport_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qml.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qml_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmldebug_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmldevtools_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlmodels.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlmodels_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmltest.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmltest_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlworkerscript.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qmlworkerscript_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quick.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quick_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickcontrols2.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickcontrols2_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickparticles_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickshapes_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quicktemplates2.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quicktemplates2_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickwidgets.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_quickwidgets_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_remoteobjects.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_remoteobjects_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_repparser.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_repparser_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_scxml.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_scxml_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sensors.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sensors_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialbus.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialbus_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialport.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_serialport_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sql.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_sql_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_svg.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_svg_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_testlib.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_testlib_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_texttospeech.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_texttospeech_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_theme_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_uiplugin.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_uitools.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_uitools_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_vulkan_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_webchannel.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_webchannel_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_websockets.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_websockets_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_widgets.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_widgets_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_windowsuiautomation_support_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_winextras.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_winextras_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xml.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xml_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xmlpatterns.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_xmlpatterns_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/modules/qt_lib_zlib_private.pri:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qt_functions.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qt_config.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/win32-g++/qmake.conf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/spec_post.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/exclusive_builds.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/toolchain.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/default_pre.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/default_pre.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/resolve_config.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/exclusive_builds_post.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/default_post.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qml_debug.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/precompile_header.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/warn_on.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qt.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/resources_functions.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/resources.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/moc.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/opengl.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/uic.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/qmake_use.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/file_copies.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/win32/windows.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/testcase_targets.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/exceptions.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/yacc.prf:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/lex.prf:
OutilModbus.pro:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Widgets.prl:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Gui.prl:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Network.prl:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/Qt5Core.prl:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/lib/qtmain.prl:
.qmake.stash:
C:/Qt/Qt5.14.2/5.14.2/mingw73_64/mkspecs/features/build_pass.prf:
qmake: FORCE
@$(QMAKE) -o Makefile OutilModbus.pro -spec win32-g++ "CONFIG+=debug" "CONFIG+=qml_debug"
qmake_all: FORCE
make_first: debug-make_first release-make_first FORCE
all: debug-all release-all FORCE
clean: debug-clean release-clean FORCE
distclean: debug-distclean release-distclean FORCE
-$(DEL_FILE) Makefile
-$(DEL_FILE) .qmake.stash
debug-mocclean:
$(MAKE) -f $(MAKEFILE).Debug mocclean
release-mocclean:
$(MAKE) -f $(MAKEFILE).Release mocclean
mocclean: debug-mocclean release-mocclean
debug-mocables:
$(MAKE) -f $(MAKEFILE).Debug mocables
release-mocables:
$(MAKE) -f $(MAKEFILE).Release mocables
mocables: debug-mocables release-mocables
check: first
benchmark: first
FORCE:
$(MAKEFILE).Debug: Makefile
$(MAKEFILE).Release: Makefile

3176
Makefile.Debug Normal file

File diff suppressed because one or more lines are too long

3081
Makefile.Release Normal file

File diff suppressed because one or more lines are too long

66
OutilModbus.pro Normal file
View File

@ -0,0 +1,66 @@
#-------------------------------------------------
#
# Project created by QtCreator 2017-03-01T13:52:35
#
#-------------------------------------------------
QT += core gui network
CONFIG += static
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = OutilModbus
TEMPLATE = app
INCLUDEPATH += Sources/ \
Sources/SerialPort/ \
Sources/SerialPort/qextserialport/src/
SOURCES += \
Sources/MainWindow.cpp \
Sources/main.cpp \
Sources/ModbusBackend.cpp \
Sources/ModbusSlave.cpp \
Sources/ModbusMaster.cpp \
Sources/OutilModbus.cpp \
Sources/ModbusRepository.cpp \
Sources/ZTInfo.cpp \
Sources/ModbusPage.cpp \
Sources/MainPage.cpp \
Sources/LazerProbeSimPage.cpp \
Sources/LazerProbeSimulator.cpp \
Sources/SerialPort/qextserialport/src/qextserialport_win.cpp \
Sources/SerialPort/qextserialport/src/qextserialport.cpp \
Sources/SEIModbusPage.cpp
HEADERS += \
Sources/MainWindow.h \
Sources/ModbusBackend.h \
Sources/ModbusSlave.h \
Sources/ModbusMaster.h \
Sources/OutilModbus.h \
Sources/ModbusRepository.h \
Sources/GlobalDefine.h \
Sources/ProtocolDefs.h \
Sources/ZTInfo.h \
Sources/ModbusPage.h \
Sources/MainPage.h \
Sources/LazerProbeSimPage.h \
Sources/LazerProbeSimulator.h \
Sources/SerialPort/qextserialport/src/qextserialport_p.h \
Sources/SerialPort/qextserialport/src/qextserialport_global.h \
Sources/SerialPort/qextserialport/src/qextserialport.h \
Sources/SEIModbusPage.h
FORMS += \
Sources/CModbusPage.ui \
Sources/MainPage.ui \
Sources/LazerProbeSimPage.ui \
Sources/SEIModbusPage.ui
DEFINES -= Q_OS_UNIX
#LIBS += $$PWD/Sources/SerialPort/libqextserialport1.a
OTHER_FILES += \
Sources/SerialPort/qextserialport/src/qextserialport.pri

1099
Sources/CModbusPage.ui Normal file

File diff suppressed because it is too large Load Diff

33
Sources/GlobalDefine.h Normal file
View File

@ -0,0 +1,33 @@
#ifndef GLOBALDEFINE_H
#define GLOBALDEFINE_H
#define RET_OK 1
#define RET_ERROR 0
//#define MODBUS_CC_ALARM_REG_START_ADDRESS 2000
//#define MODBUS_CC_TC_REG_START_ADDRESS 3000
//#define MODBUS_CC_ZT1_PPINT_FLAG_MASK 0x0001
//#define MODBUS_CC_ZT1_PPEXT_FLAG_MASK 0x0002
//#define MODBUS_CC_ZT1_PG_FLAG_MASK 0x0004
//#define MODBUS_CC_ZT1_FN_FLAG_MASK 0x0008
//#define MODBUS_CC_ZT1_V00_FLAG_MASK 0x0010
//#define MODBUS_CC_PEQ1_FLAG_MASK 0x0020
//#define MODBUS_CC_PEQ2_FLAG_MASK 0x0040
//#define MODBUS_CC_ZT2_PPINT_FLAG_MASK 0x0080
//#define MODBUS_CC_ZT2_PPEXT_FLAG_MASK 0x0100
//#define MODBUS_CC_ZT2_V02_FLAG_MASK 0x0200
//#define MODBUS_CC_ALARM_ITI_FLAG_MASK 0x0400
//#define MODBUS_CC_INVALID1_FLAG_MASK 0x0800
//#define MODBUS_CC_INVALID2_FLAG_MASK 0x1000
//#define MODBUS_CC_INVALID3_FLAG_MASK 0x2000
//#define MODBUS_CC_INVALID4_FLAG_MASK 0x4000
//#define MODBUS_CC_INVALID5_FLAG_MASK 0x8000
//#define MODBUS_CC_AN1_FLAG_MASK 0x00001
//#define MODBUS_CC_AN2_FLAG_MASK 0x00002
#endif // GLOBALDEFINE_H

View File

@ -0,0 +1,57 @@
#include "LazerProbeSimPage.h"
#include "ui_LazerProbeSimPage.h"
CLazerProbeSimPage::CLazerProbeSimPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::CLazerProbeSimPage)
{
ui->setupUi(this);
connect(ui->mMeasurementValueSlider,SIGNAL(valueChanged(int)),this,SLOT(ProbeValueChanged(int)));
ui->mValueDisplayLabel->setText(QString("%1").arg(ui->mMeasurementValueSlider->value()));
connect(ui->mEnableProbeChkBx,SIGNAL(stateChanged(int)),this,SLOT(EnableProbeChanged(int)));
connect(ui->mOutOfRangeChkBx,SIGNAL(stateChanged(int)),this,SLOT(OutOfRangeChanged(int)));
}
CLazerProbeSimPage::~CLazerProbeSimPage()
{
delete ui;
}
void CLazerProbeSimPage::ProbeValueChanged(int Value)
{
if(ui->mOutOfRangeChkBx->isChecked())
{
Value = 0;
}
ui->mValueDisplayLabel->setText(QString("%1").arg(Value));
mLazerProbe.SetProbeCurRange(Value);
}
void CLazerProbeSimPage::EnableProbeChanged(int State)
{
if(State == Qt::Checked)
{
mLazerProbe.EnableProbe(true);
}
else if(State == Qt::Unchecked)
{
mLazerProbe.EnableProbe(false);
}
}
void CLazerProbeSimPage::OutOfRangeChanged(int State)
{
if(State == Qt::Checked)
{
ProbeValueChanged(0);
}
else if(State == Qt::Unchecked)
{
ProbeValueChanged(ui->mMeasurementValueSlider->value());
}
}

View File

@ -0,0 +1,31 @@
#ifndef LAZERPROBESIMPAGE_H
#define LAZERPROBESIMPAGE_H
#include <QWidget>
#include "LazerProbeSimulator.h"
namespace Ui {
class CLazerProbeSimPage;
}
class CLazerProbeSimPage : public QWidget
{
Q_OBJECT
public:
explicit CLazerProbeSimPage(QWidget *parent = 0);
~CLazerProbeSimPage();
CLazerProbeSimulator mLazerProbe;
private:
Ui::CLazerProbeSimPage *ui;
public slots:
void ProbeValueChanged(int);
void EnableProbeChanged(int);
void OutOfRangeChanged(int);
};
#endif // LAZERPROBESIMPAGE_H

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CLazerProbeSimPage</class>
<widget class="QWidget" name="CLazerProbeSimPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1143</width>
<height>465</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QCheckBox" name="mEnableProbeChkBx">
<property name="geometry">
<rect>
<x>130</x>
<y>160</y>
<width>70</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Activer</string>
</property>
</widget>
<widget class="QSlider" name="mMeasurementValueSlider">
<property name="geometry">
<rect>
<x>100</x>
<y>90</y>
<width>291</width>
<height>19</height>
</rect>
</property>
<property name="minimum">
<number>100000</number>
</property>
<property name="maximum">
<number>200000</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
<widget class="QCheckBox" name="mOutOfRangeChkBx">
<property name="geometry">
<rect>
<x>240</x>
<y>160</y>
<width>70</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>CheckBox</string>
</property>
</widget>
<widget class="QLabel" name="mValueDisplayLabel">
<property name="geometry">
<rect>
<x>210</x>
<y>40</y>
<width>46</width>
<height>13</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,102 @@
#include "LazerProbeSimulator.h"
#include <QTextCodec>
#include <QtGlobal>
CLazerProbeSimulator::CLazerProbeSimulator()
{
// QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
mLaserProbeSerialPort = new QextSerialPort("COM1", QextSerialPort::EventDriven);
if(mLaserProbeSerialPort == NULL)
{
qDebug("Impossible de créer le port %s","COM1");
return;
}
// connect(mSRDFSerialPort, SIGNAL(readyRead()), this, SLOT(SRDFDataAvailable()));
mLaserProbeSerialPort->setBaudRate(BAUD38400);
mLaserProbeSerialPort->setFlowControl(FLOW_OFF);
mLaserProbeSerialPort->setParity(PAR_NONE);
mLaserProbeSerialPort->setDataBits(DATA_8);
mLaserProbeSerialPort->setStopBits(STOP_2);
mLaserProbeSerialPort->setTimeout(0);
if(mLaserProbeSerialPort->open(QIODevice::WriteOnly | QIODevice::Unbuffered))
{
// connect(mSRDFSerialPort, SIGNAL(readyRead()), this, SLOT(SRDFDataAvailable()));
qDebug("Port série ouvert avec succès");
}
else
{
qDebug("Impossible d'ouvrir le port série COM1");
}
mHeader = 0x54;
mValue = 0;
mTxBuf[0] = 0;
mTxBuf[1] = 0;
mTxBuf[2] = 0;
mTxTimer = new QTimer();
mTxTimer->setInterval(1);
mTxTimer->setSingleShot(false);
mTxTimer->stop();
connect(mTxTimer,SIGNAL(timeout()),this, SLOT(ProbeTxTimerExpired()));
}
CLazerProbeSimulator::~CLazerProbeSimulator()
{
qDebug("Closing serial port");
mLaserProbeSerialPort->close();
delete mLaserProbeSerialPort;
delete mTxTimer;
}
bool CLazerProbeSimulator::EnableProbe(bool Enable)
{
if(Enable)
{
qDebug("Probe enabled");
mTxTimer->start();
}
else
{
qDebug("Probe disabled");
mTxTimer->stop();
}
return true;
}
bool CLazerProbeSimulator::SetProbeCurRange(int Range)
{
mValue = Range;
qDebug(qPrintable(QString("%1").arg(mValue)));
return true;
}
void CLazerProbeSimulator::ProbeTxTimerExpired()
{
int Temp = mValue;
mHeader = (~mHeader) & LAZER_PROBE_HEADER_MASK;
mHeader |= ((char)Temp & LAZER_PROBE_DATA_NIBBLE_MASK);
mTxBuf[0] = mHeader;
Temp >>= 2;
mTxBuf[1] = (char)Temp & 0xFF;
Temp >>= 8;
mTxBuf[2] = (char)Temp & 0xFF;
QByteArray Buf;
Buf.append(mTxBuf[0]);
Buf.append(mTxBuf[1]);
Buf.append(mTxBuf[2]);
mLaserProbeSerialPort->write(Buf);
qDebug(qPrintable(QString().sprintf("[0x%x][0x%x][0x%x]",mTxBuf[0],mTxBuf[1], mTxBuf[2])));
}

View File

@ -0,0 +1,39 @@
#ifndef LAZERPROBESIMULATOR_H
#define LAZERPROBESIMULATOR_H
#include <QObject>
#include "qextserialport.h"
#include <QTimer>
#include <QByteArray>
class CLazerProbeSimulator : public QObject
{
Q_OBJECT
#define LAZER_PROBE_HEADER_MASK 0xFC
#define LAZER_PROBE_DATA_NIBBLE_MASK 0x03
public:
CLazerProbeSimulator();
~CLazerProbeSimulator();
bool EnableProbe(bool Enable);
bool SetProbeCurRange(int Range);
private:
QextSerialPort *mLaserProbeSerialPort;
QTimer *mTxTimer;
quint8 mHeader;
char mTxBuf[3];
quint32 mValue;
public slots:
void ProbeTxTimerExpired(void);
};
#endif // LAZERPROBESIMULATORESIMULATOR_H

32
Sources/MainPage.cpp Normal file
View File

@ -0,0 +1,32 @@
#include "MainPage.h"
#include "LazerProbeSimPage.h"
#include "SEIModbusPage.h"
#include "ui_MainPage.h"
#include "OutilModbus.h"
CMainPage::CMainPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::CMainPage)
{
ui->setupUi(this);
}
CMainPage::~CMainPage()
{
delete ui;
}
int CMainPage::RegisterPagesTabs(CModbusPage *ModbusPage, CLazerProbeSimPage* LazerSimPage, CSEIModbusPage *SEIModbusPage)
{
ui->mMainPageTabs->clear();
ui->mMainPageTabs->addTab((QWidget*)ModbusPage,"Modbus CC");
ui->mMainPageTabs->addTab((QWidget*)SEIModbusPage,"Modbus SEI");
ui->mMainPageTabs->addTab((QWidget*)LazerSimPage,"Sondes");
//ModbusPage->show();
ui->mMainPageTabs->setCurrentIndex(1);
return 1;
}

31
Sources/MainPage.h Normal file
View File

@ -0,0 +1,31 @@
#ifndef MAINPAGE_H
#define MAINPAGE_H
#include <QWidget>
class COutilModbus;
class CModbusPage;
class CLazerProbeSimPage;
class CSEIModbusPage;
namespace Ui {
class CMainPage;
}
class CMainPage : public QWidget
{
Q_OBJECT
public:
explicit CMainPage(QWidget *parent = 0);
~CMainPage();
COutilModbus *mProgramHandle;
int RegisterPagesTabs(CModbusPage*, CLazerProbeSimPage*, CSEIModbusPage*);
private:
Ui::CMainPage *ui;
};
#endif // MAINPAGE_H

42
Sources/MainPage.ui Normal file
View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CMainPage</class>
<widget class="QWidget" name="CMainPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1431</width>
<height>1008</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QTabWidget" name="mMainPageTabs">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>1421</width>
<height>1011</height>
</rect>
</property>
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="Modbus">
<attribute name="title">
<string>Tab 1</string>
</attribute>
</widget>
<widget class="QWidget" name="Sondes">
<attribute name="title">
<string>Tab 2</string>
</attribute>
</widget>
</widget>
</widget>
<resources/>
<connections/>
</ui>

125
Sources/MainWindow.cpp Normal file
View File

@ -0,0 +1,125 @@
#include "MainWindow.h"
#include <QWidget>
#include "OutilModbus.h"
MainWindow::MainWindow(QWidget *parent,COutilModbus* ProgramHandle)
: QMainWindow(parent),
mProgramHandle(ProgramHandle)
{
resize(1024,768);
mMainPage = new CMainPage(this);
mMainPage->mProgramHandle = ProgramHandle;
mSEIModbusPage = new CSEIModbusPage(this);
mSEIModbusPage->mProgramHandle = ProgramHandle;
mModbusPage = new CModbusPage();
mModbusPage->mProgramHandle = ProgramHandle;
mLazerSimPage = new CLazerProbeSimPage;
setCentralWidget(mMainPage);
mMainPage->RegisterPagesTabs(mModbusPage,mLazerSimPage, mSEIModbusPage);
// setWindowFlags(Qt::WindowStaysOnTopHint);
// QHBoxLayout *MainLayout = new QHBoxLayout;
// QWidget *test = new QWidget();
// mCCGridLayout = new QGridLayout();
// mSEIGridLayout = new QGridLayout();
// test->setLayout(MainLayout);
// setCentralWidget(test);
// test->resize(200,200);
// MainLayout->addLayout(mCCGridLayout);
// MainLayout->addLayout(mSEIGridLayout);
// mConnectToSlaveBtn = new QPushButton("Connect to slave");
// connect(mConnectToSlaveBtn,SIGNAL(clicked()),this,SLOT(ButtonPushed()));
// mSendWriteMultipleHR = new QPushButton("Write Multiple HR");
// connect(mSendWriteMultipleHR,SIGNAL(clicked()),this,SLOT(ButtonPushed()));
// mSendReadHR = new QPushButton("Read HR");
// connect(mSendReadHR,SIGNAL(clicked()),this,SLOT(ButtonPushed()));
// mWriteSingleHR = new QPushButton("Write Single HR");
// connect(mWriteSingleHR,SIGNAL(clicked()),this,SLOT(ButtonPushed()));
// mAlarmePPIZT1 = new QLabel("Alarme PP Int. ZT1");
// mAlarmePPEZT1 = new QLabel("Alarem PP Ext. ZT1");
// mAlarmePG = new QLabel("Alarme PG ZT1");
// mAlarmeFN = new QLabel("Alarme FN");
// mAlarmePEQ1 = new QLabel("PEQ1");
// mAlarmePEQ2 = new QLabel("PEQ2");
// mAlarmePPIZT2 = new QLabel("Alarme PP Int. ZT2");
// mAlarmePPEZT2 = new QLabel("Alarme PP Ext. ZT2");
// mITI = new QLabel("Itinéraire: 10/12");
// mRankPPZT1 = new QLabel("Rang PP ZT1: 0");
// mRankPG = new QLabel("Rang PG ZT1: 0");
// mRankPPZT2 = new QLabel("Rang PP ZT2: 0");
// mCCEventsList = new QTextEdit;
// mCCEventsList->setText("");
// mCCGridLayout->addWidget(mCCEventsList,20,0,10,30);
// mSEIEventsList = new QTextEdit;
// mSEIEventsList->setText("TEST\nTest\nTEST\na;sdlfjkasl;fjasl;dkfjasl;dfjsdj\ntest");
// mSEIEventsList->resize(200,60);
// mSEIGridLayout->addWidget(mSEIEventsList,0,20,10,30);
// mCCGridLayout->addWidget(mConnectToSlaveBtn,0,0);
// mCCGridLayout->addWidget(mSendWriteMultipleHR,0,1);
// mCCGridLayout->addWidget(mSendReadHR,0,2);
// mCCGridLayout->addWidget(mWriteSingleHR,0,3);
// mCCGridLayout->addWidget(mAlarmePPIZT1,5,0);
// mCCGridLayout->addWidget(mAlarmePPEZT1,5,1);
// mCCGridLayout->addWidget(mAlarmePG,5,2);
// mCCGridLayout->addWidget(mAlarmeFN,5,3);
// mCCGridLayout->addWidget(mAlarmePEQ1,6,0);
// mCCGridLayout->addWidget(mAlarmePEQ2,6,1);
// mCCGridLayout->addWidget(mAlarmePPIZT2,6,2);
// mCCGridLayout->addWidget(mAlarmePPEZT2,6,3);
// mCCGridLayout->addWidget(mITI,7,0);
// mCCGridLayout->addWidget(mRankPPZT1,8,0);
// mCCGridLayout->addWidget(mRankPG,9,0,1,1,Qt::AlignLeft);
// mCCGridLayout->addWidget(mRankPPZT2,10,0,1,1,Qt::AlignLeft);
}
MainWindow::~MainWindow()
{
}
void MainWindow::ButtonPushed()
{
// QObject *Btn = QObject::sender();
// qDebug("Button clicked:");
// if(Btn == mConnectToSlaveBtn)
// {
// qDebug("Button clicked: mConnectToSlaveBtn");
// }
// else if(Btn == mSendWriteMultipleHR)
// {
// qDebug("Button clicked: mSendWriteMultipleHR");
// }
// else if(Btn == mSendReadHR)
// {
// qDebug("Button clicked: mSendReadHR");
// }
// else if(Btn == mWriteSingleHR)
// {
// qDebug("Button clicked: mWriteSingleHR");
// }
}

41
Sources/MainWindow.h Normal file
View File

@ -0,0 +1,41 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
#include <QGridLayout>
#include <QLabel>
#include <QTextEdit>
#include "ModbusPage.h"
#include "MainPage.h"
#include "LazerProbeSimPage.h"
#include "SEIModbusPage.h"
class COutilModbus;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0,COutilModbus* ProgramHandle = 0);
~MainWindow();
CMainPage *mMainPage;
CModbusPage *mModbusPage;
COutilModbus *mProgramHandle;
CLazerProbeSimPage *mLazerSimPage;
CSEIModbusPage *mSEIModbusPage;
// QGridLayout *mCCGridLayout, *mSEIGridLayout;
// QPushButton *mConnectToSlaveBtn, *mSendWriteMultipleHR, *mSendReadHR, *mWriteSingleHR;
// QTextEdit *mCCEventsList, *mSEIEventsList;
// QLabel *mAlarmePPIZT1, *mAlarmePPEZT1, *mAlarmePG, *mAlarmeFN, *mAlarmePEQ1, *mAlarmePEQ2, *mAlarmePPIZT2, *mAlarmePPEZT2, *mITI, *mRankPPZT1, *mRankPG, *mRankPPZT2;
public slots:
void ButtonPushed();
};
#endif // MAINWINDOW_H

707
Sources/ModbusBackend.cpp Normal file
View File

@ -0,0 +1,707 @@
#include "ModbusBackend.h"
#include "QBuffer"
#include <QDataStream>
CModbusBackend::CModbusBackend(CModbusRepository *Repo)
{
mModbusTCPSocketHandle = 0;
mDataLinkValid = false;
mModbusRepo = Repo;
mModbusMode = MODBUS_INVALID_MODE;
mTransactionIDCounter = 0;
mDeviceID = 1;//0xFF;
mModbusMaxRetry = MODBUS_RETRY_MAX_COUNT;
mModbusRequestTimeout = MODBUS_RETRY_DELAY;
}
CModbusBackend::~CModbusBackend()
{
}
void CModbusBackend::ModbusDataReady()
{
CModbusTransaction Transaction;
QByteArray InData = mModbusTCPSocketHandle->readAll();
QBuffer FileBuffer(&InData);
FileBuffer.open(QIODevice::ReadOnly);
FileBuffer.seek(0);
QDataStream *TransactionDataStrm = new QDataStream(&FileBuffer);
*TransactionDataStrm >> Transaction.mHeader;
*TransactionDataStrm >> Transaction.mPDU.mFunctionCode;
Transaction.mPDU.mData = InData.right(Transaction.mHeader.mMessageLength - 2); //-2 to remove Device ID and Function Code.
// qDebug("modbus data received %s",InData.toHex().data());
// qDebug("Transaction ID 0x%X",Transaction.mHeader.mTransactionID);
// qDebug("Message Length %d",Transaction.mHeader.mMessageLength);
// qDebug("Protocol ID 0x%X",Transaction.mHeader.mProtocolID);
// qDebug("Unit ID 0x%X",Transaction.mHeader.mUnitID);
// qDebug("Function Code 0x%X",Transaction.mPDU.mFunctionCode);
// qDebug("Data %s",Transaction.mPDU.mData.toHex().data());
if(mModbusMode == MODBUS_MASTER_MODE)
{
AnalyzeModbusResponse(Transaction);
}
else if( mModbusMode == MODBUS_SLAVE_MODE)
{
AnalyzeModbusRequest(Transaction);
}
else
{
qDebug("Illegal modbus backend mode...");
}
emit ModbusRX();
}
void CModbusBackend::ModbusLinkDisconnected()
{
qDebug("Modbus link disconnected");
mDataLinkValid = false;
}
//In client mode. This is the request from the master.
int CModbusBackend::AnalyzeModbusRequest(CModbusTransaction Transaction)
{
if(Transaction.mHeader.mProtocolID != 0)
{
//Invalid protocol... what can we do?
return 0;
}
switch(Transaction.mPDU.mFunctionCode)
{
case MODBUS_FCT_READ_HOLDING_REGISTERS:
{
bool ok = true;
unsigned short StartAdress = 0;
StartAdress = Transaction.mPDU.mData[0]&0xFF;
StartAdress <<= 8;
StartAdress += Transaction.mPDU.mData[1]&0xFF;
unsigned short NbRegisters = 0;
NbRegisters = Transaction.mPDU.mData[2]&0xFF;
NbRegisters <<= 8;
NbRegisters += Transaction.mPDU.mData[3]&0xFF;
//Validate nb of registers
if(NbRegisters < 1 || NbRegisters > MODBUS_MAX_NB_REGISTERS)
{
SendErrorResponse(Transaction,MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE);
// emit ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_FCT_READ_HOLDING_REGISTERS);
ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_FCT_READ_HOLDING_REGISTERS);
return 0;
}
//Validate data range
if(!mModbusRepo->IsHRValid(StartAdress,NbRegisters))
{
qDebug("Reg invalid");
//Send negative response
SendErrorResponse(Transaction,MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS);
// emit ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,MODBUS_FCT_READ_HOLDING_REGISTERS);
ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,MODBUS_FCT_READ_HOLDING_REGISTERS);
return 0;
}
QByteArray data = mModbusRepo->GetHRData(StartAdress,NbRegisters,&ok);
// qDebug("Slave Rx Read Holding Registers. Address: %d, Nb Reg: %d",StartAdress, NbRegisters);
// qDebug("Data: %s",data.toHex().data());
//The response to a HR reading needs the byte count before the data.
quint8 ByteCount = data.size();
data.prepend(ByteCount);
SendModbusResponse(Transaction, data);
//All OK
break;
}
case MODBUS_WRITE_SINGLE_REGISTER:
{
unsigned short StartAdress = 0;
StartAdress = Transaction.mPDU.mData[0]&0xFF;
StartAdress <<= 8;
StartAdress += Transaction.mPDU.mData[1]&0xFF;
//Validate data range
if(!mModbusRepo->IsHRValid(StartAdress,1))
{
qDebug("Reg invalid");
//Send negative response
SendErrorResponse(Transaction,MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS);
// emit ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,MODBUS_WRITE_SINGLE_REGISTER);
ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,MODBUS_WRITE_SINGLE_REGISTER);
return 0;
}
//Extract data.
QByteArray data = Transaction.mPDU.mData.right(2);
//Write register data
mModbusRepo->WriteHRData(StartAdress,1,data);
// qDebug("Slave Rx Write Single Register. Address: %d, Value: 0x%s",StartAdress, data.toHex().data());
// qDebug("Data: %s",data.toHex().data());
data = Transaction.mPDU.mData.left(4); //The response corresponds to the Reg. Address & the value. Which is the first 4 bytes of the initial request.
SendModbusResponse(Transaction, data);
// emit RegistersDatabaseUpdated(StartAdress,1);
RegistersDatabaseUpdated(StartAdress,1);
break;
}
case MODBUS_FCT_WRITE_MULTIPLE_REGISTERS:
{
unsigned short StartAdress = 0;
StartAdress = Transaction.mPDU.mData[0]&0xFF;
StartAdress <<= 8;
StartAdress += Transaction.mPDU.mData[1]&0xFF;
unsigned short NbRegisters = 0;
NbRegisters = Transaction.mPDU.mData[2]&0xFF;
NbRegisters <<= 8;
NbRegisters += Transaction.mPDU.mData[3]&0xFF;
quint8 ByteCount = Transaction.mPDU.mData[4];
//Validate nb of registers
if(NbRegisters < 1 || NbRegisters > 0x7D || ByteCount != (NbRegisters*2))
{
qDebug("Invalid register number or byte count ");
SendErrorResponse(Transaction,MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE);
// emit ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_FCT_WRITE_MULTIPLE_REGISTERS);
ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_FCT_WRITE_MULTIPLE_REGISTERS);
return 0;
}
//Validate data range
if(!mModbusRepo->IsHRValid(StartAdress,NbRegisters))
{
qDebug("Reg invalid");
//Send negative response
SendErrorResponse(Transaction,MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS);
// emit ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,MODBUS_FCT_WRITE_MULTIPLE_REGISTERS);
ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS,MODBUS_FCT_WRITE_MULTIPLE_REGISTERS);
return 0;
}
//Extract data.
QByteArray data = Transaction.mPDU.mData.right(ByteCount);
//Write register data
mModbusRepo->WriteHRData(StartAdress,NbRegisters,data);
// qDebug("Slave Rx Write Multiple Registers. Address: %d, Nb Reg: %d",StartAdress, NbRegisters);
// qDebug("Data: %s",data.toHex().data());
data = Transaction.mPDU.mData.left(4); //The response corresponds to the Start Adress and Nb of Regs. Which is the first 4 bytes of the initial request.
SendModbusResponse(Transaction, data);
// emit RegistersDatabaseUpdated(StartAdress,NbRegisters);
RegistersDatabaseUpdated(StartAdress,NbRegisters);
break;
}
default:
{
//Received "Illegal function code". Send the exception code to master
//TODO: Log this.
qDebug("Slave received illegal function code from master: 0x%x",Transaction.mPDU.mFunctionCode);
SendErrorResponse(Transaction,MODBUS_EXCEPTION_ILLEGAL_FCT);
// emit ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_FCT,Transaction.mPDU.mFunctionCode);
ModbusRequestException(MODBUS_EXCEPTION_ILLEGAL_FCT,Transaction.mPDU.mFunctionCode);
break;
}
}
return 1;
}
int CModbusBackend::SendModbusResponse(CModbusTransaction RequestTransaction, QByteArray Data)
{
QByteArray ModbusPacket;
QBuffer Buffer(&ModbusPacket);
Buffer.open(QIODevice::WriteOnly|QIODevice::Unbuffered);
Buffer.seek(0);
QDataStream *PacketDataStrm = new QDataStream(&Buffer);
//For a response, the header will be the same as the original request, except for the msg. length.
//Set the appropriate msg length.
RequestTransaction.mHeader.mMessageLength = Data.size() + 2; //+2 to add function code & Unit ID.
RequestTransaction.mPDU.mData = Data;
*PacketDataStrm << RequestTransaction.mHeader;
*PacketDataStrm << RequestTransaction.mPDU.mFunctionCode;
Buffer.close();
ModbusPacket.append(Data);
// qDebug("Response packet: %s",ModbusPacket.toHex().data());
mModbusTCPSocketHandle->write(ModbusPacket);
delete PacketDataStrm;
return RET_OK;
}
//In Master mode. This is the response from slave to a previously sent request.
int CModbusBackend::AnalyzeModbusResponse(CModbusTransaction Transaction)
{
if(Transaction.mHeader.mProtocolID != 0)
{
//Invalid protocol... what can we do?
return RET_ERROR;
}
//Find matching request and remove it from the queue...
CModbusRequest *Request;
bool Found = false;
for(int i = 0; i < mRequestsList.size(); i++)
{
if(mRequestsList.at(i)->mHeader.mTransactionID == Transaction.mHeader.mTransactionID)
{
Request = mRequestsList.takeAt(i); //Remove from queue and keep a copy
Request->mRequestTimer->stop(); //Stop the resend timer
Found = true;
}
}
if(Found == false)
{
//Invalid request number. This should happen only if a very long delay exists in the comm.
//TODO: Log this...
qDebug("Master received response to a non existent request!!!");
return RET_ERROR;
}
//check if we have an exception response
if((Transaction.mPDU.mFunctionCode & MODBUS_EXCEPTION_FCT_MASK) != 0)
{
//we have an exception response... something went wrong.
quint8 ExceptionCode = Transaction.mPDU.mData[0];
//TODO: Manage this!
qDebug("Master Rx exception code %d to request %d",ExceptionCode,Request->mPDU.mFunctionCode);
emit ModbusResponseException(ExceptionCode,Request->mPDU.mFunctionCode);
delete Request;
return RET_ERROR;
}
switch(Transaction.mPDU.mFunctionCode)
{
case MODBUS_FCT_READ_HOLDING_REGISTERS:
{
quint8 ByteCount = 0;
ByteCount = Transaction.mPDU.mData.at(0);
if((Request->mNbRegisters*2) != ByteCount)
{
//Inconsistency between the data range and the data count.
//TODO: Log the error.
qDebug("Master eceived a wrong data size in response for a MODBUS_FCT_READ_HOLDING_REGISTERS request");
emit ModbusResponseException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_FCT_READ_HOLDING_REGISTERS);
delete Request;
return RET_ERROR;
}
QByteArray RegisterValues = Transaction.mPDU.mData.right(ByteCount);
// qDebug("Master Rx Read Holding Registers Response.");
// qDebug("Data: %s",RegisterValues.toHex().data());
mModbusRepo->WriteHRData(Request->mStartAddress,Request->mNbRegisters,RegisterValues);
RegistersDatabaseUpdated(Request->mStartAddress, Request->mNbRegisters);
break;
}
case MODBUS_WRITE_SINGLE_REGISTER:
{
quint16 RegAddress = 0;
RegAddress = Transaction.mPDU.mData[0]&0xFF;
RegAddress <<= 8;
RegAddress += Transaction.mPDU.mData[1]&0xFF;
if(Request->mStartAddress != RegAddress)
{
//Inconsistency between the request Adress and response Adress.
//TODO: Log the error.
qDebug("Master received a wrong Register Adress in response for a MODBUS_WRITE_SINGLE_REGISTER request. Expected [%d], Rx[%d]",Request->mStartAddress, RegAddress);
emit ModbusResponseException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_WRITE_SINGLE_REGISTER);
delete Request;
return RET_ERROR;
}
// qDebug("Master Rx Write Single Register response. Address: %d,",RegAddress);
// qDebug("Data: %s",Transaction.mPDU.mData.toHex().data());
//Everything seems good.
break;
}
case MODBUS_FCT_WRITE_MULTIPLE_REGISTERS:
{
unsigned short StartAdress = 0;
StartAdress = Transaction.mPDU.mData[0]&0xFF;
StartAdress <<= 8;
StartAdress += Transaction.mPDU.mData[1]&0xFF;
unsigned short NbRegisters = 0;
NbRegisters = Transaction.mPDU.mData[2]&0xFF;
NbRegisters <<= 8;
NbRegisters += Transaction.mPDU.mData[3]&0xFF;
if(StartAdress != Request->mStartAddress || NbRegisters != Request->mNbRegisters)
{
//Inconsistency between the request Adress or NbRegisters and response.
//TODO: Log the error.
qDebug("Master Received a wrong Register Adress or NbRegisters in response for a MODBUS_FCT_WRITE_MULTIPLE_REGISTERS request");
emit ModbusResponseException(MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE,MODBUS_FCT_WRITE_MULTIPLE_REGISTERS);
delete Request;
return RET_ERROR;
}
// qDebug("Master Rx Write Multiple Registers response. Address: %d, Nb Reg: %d",StartAdress, NbRegisters);
// qDebug("Data: %s",Transaction.mPDU.mData.toHex().data());
//All is good.
break;
}
default:
{
//Received "Illegal function code" response
//TODO: Log this.
qDebug("Master received illegal function code 0x%x",Transaction.mPDU.mFunctionCode);
emit ModbusResponseException(MODBUS_EXCEPTION_ILLEGAL_FCT,MODBUS_FCT_WRITE_MULTIPLE_REGISTERS);
break;
}
}
delete Request;
return 1;
}
int CModbusBackend::SendModbusRequest(CModbusRequest *Request)
{
QByteArray ModbusPacket;
QBuffer Buffer(&ModbusPacket);
Buffer.open(QIODevice::WriteOnly|QIODevice::Unbuffered);
Buffer.seek(0);
QDataStream *PacketDataStrm = new QDataStream(&Buffer);
*PacketDataStrm << Request->mHeader;
*PacketDataStrm << Request->mPDU.mFunctionCode;
Buffer.close();
ModbusPacket.append(Request->mPDU.mData);
// qDebug("Request packet: %s",ModbusPacket.toHex().data());
mModbusTCPSocketHandle->write(ModbusPacket);
mModbusTCPSocketHandle->flush();
return RET_OK;
}
int CModbusBackend::SendErrorResponse(CModbusTransaction RequestTransaction, quint8 ErrorCode)
{
QByteArray ModbusPacket;
QBuffer Buffer(&ModbusPacket);
Buffer.open(QIODevice::WriteOnly|QIODevice::Unbuffered);
Buffer.seek(0);
QDataStream *PacketDataStrm = new QDataStream(&Buffer);
//For a response, the header will be the same as the original request, except for the msg. length.
//Set the appropriate msg length.
RequestTransaction.mHeader.mMessageLength = 3; //Unit ID, function code & Exception code.
*PacketDataStrm << RequestTransaction.mHeader;
Buffer.close();
ModbusPacket.append(RequestTransaction.mPDU.mFunctionCode + 0x80);
ModbusPacket.append(ErrorCode);
// qDebug("Sending error code %d. Error packet: %s",ErrorCode,ModbusPacket.toHex().data());
mModbusTCPSocketHandle->write(ModbusPacket);
delete PacketDataStrm;
return RET_OK;
}
int CModbusBackend::SendReadHoldingRegistersRequest(quint16 StartAddress, quint16 RegisterCount)
{
//First, validate that the reading range is within our repo
if(mModbusRepo->IsHRValid(StartAddress,RegisterCount) == false)
{
qDebug("Trying to send a read HR in an invalid range");
return RET_ERROR;
}
//Create a request.
CModbusRequest *NewRequest = new CModbusRequest;
NewRequest->mStartAddress = StartAddress;
NewRequest->mNbRegisters = RegisterCount;
connect(NewRequest->mRequestTimer,SIGNAL(timeout()),this,SLOT(RequestTimerExpired()));
NewRequest->mPDU.mData.clear();
NewRequest->mPDU.mFunctionCode = MODBUS_FCT_READ_HOLDING_REGISTERS;
quint8 HighByte, LowByte;
LowByte = StartAddress & 0x00FF;
HighByte = (StartAddress >> 8) & 0x00FF;
NewRequest->mPDU.mData.append(HighByte);
NewRequest->mPDU.mData.append(LowByte);
LowByte = RegisterCount & 0x00FF;
HighByte = (RegisterCount >> 8) & 0x00FF;
NewRequest->mPDU.mData.append(HighByte);
NewRequest->mPDU.mData.append(LowByte);
NewRequest->mHeader.mMessageLength = NewRequest->mPDU.mData.size() + 2;
NewRequest->mHeader.mProtocolID = 0;
NewRequest->mHeader.mTransactionID = (qint16)GetNewTransactionID();
NewRequest->mHeader.mUnitID = mDeviceID;
mRequestsList.append(NewRequest);
SendModbusRequest(NewRequest);
NewRequest->mRequestTimer->start(mModbusRequestTimeout);
return RET_OK;
}
int CModbusBackend::SendWriteHoldingRegistersRequest(quint16 StartAddress, quint16 RegisterCount)
{
//First, validate that the reading range is within our repo
if(mModbusRepo->IsHRValid(StartAddress,RegisterCount) == false)
{
qDebug("Trying to send a read HR in an invalid range");
return RET_ERROR;
}
if(RegisterCount > MODBUS_MAX_NB_REGISTERS)
{
return RET_ERROR;
}
//Get data.
bool OK;
QByteArray RegData = mModbusRepo->GetHRData(StartAddress,RegisterCount,&OK);
if(OK == false)
{
return RET_ERROR;
}
//Create a request.
CModbusRequest *NewRequest = new CModbusRequest;
NewRequest->mStartAddress = StartAddress;
NewRequest->mNbRegisters = RegisterCount;
connect(NewRequest->mRequestTimer,SIGNAL(timeout()),this,SLOT(RequestTimerExpired()));
NewRequest->mPDU.mData.clear();
NewRequest->mPDU.mFunctionCode = MODBUS_FCT_WRITE_MULTIPLE_REGISTERS;
//Start address
quint8 HighByte, LowByte;
LowByte = StartAddress & 0x00FF;
HighByte = (StartAddress >> 8) & 0x00FF;
NewRequest->mPDU.mData.append(HighByte);
NewRequest->mPDU.mData.append(LowByte);
//Nb registers
LowByte = RegisterCount & 0x00FF;
HighByte = (RegisterCount >> 8) & 0x00FF;
NewRequest->mPDU.mData.append(HighByte);
NewRequest->mPDU.mData.append(LowByte);
//Byte Count
NewRequest->mPDU.mData.append(RegData.size());
//Datal
NewRequest->mPDU.mData.append(RegData);
NewRequest->mHeader.mMessageLength = NewRequest->mPDU.mData.size() + 2;
NewRequest->mHeader.mProtocolID = 0;
NewRequest->mHeader.mTransactionID = (qint16)GetNewTransactionID();
NewRequest->mHeader.mUnitID = mDeviceID;
mRequestsList.append(NewRequest);
SendModbusRequest(NewRequest);
NewRequest->mRequestTimer->start(mModbusRequestTimeout);
return RET_OK;
}
int CModbusBackend::SendWriteSingleRegisterRequest(quint16 Address)
{
if(Address == 2000)
{
qDebug("Write single reg 2000");
}
//First, validate that the reading range is within our repo
if(mModbusRepo->IsHRValid(Address,1) == false)
{
qDebug("Trying to send a read HR in an invalid range");
return RET_ERROR;
}
//Get data.
bool OK;
QByteArray RegData = mModbusRepo->GetHRData(Address,1,&OK);
if(OK == false)
{
return RET_ERROR;
}
//Create a request.
CModbusRequest *NewRequest = new CModbusRequest;
NewRequest->mStartAddress = Address;
NewRequest->mNbRegisters = 1;
connect(NewRequest->mRequestTimer,SIGNAL(timeout()),this,SLOT(RequestTimerExpired()));
NewRequest->mPDU.mData.clear();
NewRequest->mPDU.mFunctionCode = MODBUS_WRITE_SINGLE_REGISTER;
quint8 HighByte, LowByte;
LowByte = Address & 0x00FF;
HighByte = (Address >> 8) & 0x00FF;
NewRequest->mPDU.mData.append(HighByte);
NewRequest->mPDU.mData.append(LowByte);
// LowByte = RegData & 0x00FF;
// HighByte = (RegData >> 8) & 0x00FF;
// NewRequest->mPDU.mData.append(HighByte);
// NewRequest->mPDU.mData.append(LowByte);
NewRequest->mPDU.mData.append(RegData);
NewRequest->mHeader.mMessageLength = NewRequest->mPDU.mData.size() + 2;
NewRequest->mHeader.mProtocolID = 0;
NewRequest->mHeader.mTransactionID = (qint16)GetNewTransactionID();
NewRequest->mHeader.mUnitID = mDeviceID;
mRequestsList.append(NewRequest);
SendModbusRequest(NewRequest);
NewRequest->mRequestTimer->start(mModbusRequestTimeout);
return RET_OK;
}
void CModbusBackend::RequestTimerExpired()
{
//find the expired request
for(int i = 0; i < mRequestsList.size(); i++)
{
if(mRequestsList.at(i)->mRequestTimer->isActive() == false)
{
if(mRequestsList.at(i)->mRetries >= mModbusMaxRetry)
{
//The max number of retry has been reached. The device is probably offline.
qDebug("Modbus Master: Request sent to slave without response");
delete mRequestsList[i];
mRequestsList.removeAt(i);
//TODO: Manage this situation (log?)
return;
}
else
{
SendModbusRequest(mRequestsList[i]);
mRequestsList.at(i)->mRequestTimer->start(mModbusRequestTimeout);
mRequestsList[i]->mRetries++;
}
}
}
}
quint16 CModbusBackend::GetNewTransactionID()
{
quint16 ID = mTransactionIDCounter++;
if(mTransactionIDCounter == 0xFFFF - 10)
{
mTransactionIDCounter = 0;
}
return ID;
}
CModbusRequest::CModbusRequest():
mRetries(0)
{
mRequestTimer = new QTimer;
mRequestTimer->setSingleShot(true);
}
CModbusRequest::~CModbusRequest()
{
delete mRequestTimer;
}
QDataStream &operator<<(QDataStream &out, const CModbusHeader &source)
{
out << source.mTransactionID
<< source.mProtocolID
<< source.mMessageLength
<< source.mUnitID
;
return out;
}
QDataStream &operator>>(QDataStream &in, CModbusHeader &dest)
{
in >> dest.mTransactionID
>> dest.mProtocolID
>> dest.mMessageLength
>> dest.mUnitID
;
return in;
}
//Virtual function that should not even get called...
void CModbusBackend::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode)
{
qDebug("ModbusResponseException called from within slave object... weird stuff!");
}
//Virtual function that should not even get called...
void CModbusBackend::ModbusRequestException(quint8 ExceptionCode, quint8 FctCode)
{
qDebug("ModbusResponseException called from within master object... weird stuff!");
}

170
Sources/ModbusBackend.h Normal file
View File

@ -0,0 +1,170 @@
#ifndef CMODBUSBACKEND_H
#define CMODBUSBACKEND_H
#include <QObject>
#include <QTcpSocket>
#include "ModbusRepository.h"
#include <QTimer>
#define MODBUS_EXCEPTION_FCT_MASK 0x80
#define MODBUS_RETRY_DELAY 2000 //millisecs
#define MODBUS_RETRY_MAX_COUNT 2 //resend an unanswered request this many times
#define MODBUS_MAX_NB_REGISTERS 0x7D
enum eModbusFunctions
{
MODBUS_FCT_READ_HOLDING_REGISTERS = 3,
MODBUS_WRITE_SINGLE_REGISTER = 6,
MODBUS_FCT_WRITE_MULTIPLE_REGISTERS = 16
};
enum eModbusExceptionCodes
{
MODBUS_EXCEPTION_ILLEGAL_FCT = 1,
MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS = 2,
MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE = 3,
MODBUS_EXCEPTION_SERVER_DEVICE_FAILURE = 4,
MODBUS_EXCEPTION_ACKNOWLEDGE = 5,
MODBUS_EXCEPTION_SERVER_DEVICE_BUSY = 6,
MODBUS_EXCEPTION_MEMORY_PARITY_ERROR = 8,
MODBUS_EXCEPTION_GATEWAY_PATH_UNAVAILABLE = 10,
MODBUS_EXCEPTION_GATEWAY_TARGET_DEV_NOT_RESPONDING = 11
};
enum eModbusModes
{
MODBUS_MASTER_MODE,
MODBUS_SLAVE_MODE,
MODBUS_INVALID_MODE
};
class CModbusException
{
public:
};
class CModbusPDU
{
public:
qint8 mFunctionCode;
QByteArray mData;
};
class CModbusHeader
{
public:
qint16 mTransactionID;
qint16 mProtocolID;
qint16 mMessageLength;
qint8 mUnitID;
};
class CModbusTransaction
{
public:
CModbusHeader mHeader;
CModbusPDU mPDU;
};
class CModbusRequest : public CModbusTransaction
{
public:
CModbusRequest();
~CModbusRequest();
int mRetries;
QTimer *mRequestTimer;
quint16 mStartAddress, mNbRegisters; //For convinience...
};
class CModbusBackend : public QObject
{
Q_OBJECT
private:
enum eModbusMasterSMStates
{
MODBUS_SM_WAIT_FOR__STATE
};
enum eModbusSlaveSMStates
{
};
public:
CModbusBackend(CModbusRepository *Repo);
virtual ~CModbusBackend();
QTcpSocket *mModbusTCPSocketHandle;
CModbusRepository *mModbusRepo;
bool mDataLinkValid;
int mModbusMode;
void SetDeviceID(qint8 ID){mDeviceID = ID;}
//Master (client)
int SendReadHoldingRegistersRequest(quint16 StartAddress, quint16 RegisterCount);
int SendWriteHoldingRegistersRequest(quint16 StartAddress, quint16 RegisterCount);
int SendWriteSingleRegisterRequest(quint16 Address);
void ModbusLinkDisconnected();
virtual void RegistersDatabaseUpdated(quint16 StartAdderss, quint16 Length) = 0;
//Master signals
virtual void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode);
// //Slave signals
virtual void ModbusRequestException(quint8 ExceptionCode, quint8 FctCode);
private:
qint8 mDeviceID;
//Slave (server)
int AnalyzeModbusRequest(CModbusTransaction Transaction);
int ModbusStateMachine(int Event, QByteArray Data);
int SendModbusResponse(CModbusTransaction RequestTransaction, QByteArray Data);
int SendErrorResponse(CModbusTransaction RequestTransaction, quint8 ErrorCode);
//Master (client)
QList<CModbusRequest*> mRequestsList;
int SendModbusRequest(CModbusRequest *Request);
quint16 GetNewTransactionID();
int AnalyzeModbusResponse(CModbusTransaction Transaction);
quint16 mTransactionIDCounter;
int mModbusRequestTimeout;
int mModbusMaxRetry;
signals:
// void RegistersDatabaseUpdated(quint16 StartAdderss, quint16 Length);
// //Master signals
// void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode);
//// //Slave signals
// void ModbusRequestException(quint8 ExceptionCode, quint8 FctCode);
void ModbusRX();
public slots:
void ModbusDataReady();
void RequestTimerExpired();
};
QDataStream &operator<<(QDataStream &out, const CModbusHeader &source);
QDataStream &operator>>(QDataStream &in, CModbusHeader &dest);
#endif // CMODBUSBACKEND_H

113
Sources/ModbusMaster.cpp Normal file
View File

@ -0,0 +1,113 @@
#include "ModbusMaster.h"
#include <QTcpSocket>
#include "ProtocolDefs.h"
CModbusMaster::CModbusMaster(CModbusRepository *Repo):
CModbusBackend(Repo)
{
// connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady()));
mModbusMode = MODBUS_MASTER_MODE;
mModbusTCPSocketHandle = new QTcpSocket();
connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady()));
connect(mModbusTCPSocketHandle,SIGNAL(disconnected()),this,SLOT(SocketDisconnected()));
connect(mModbusTCPSocketHandle,SIGNAL(connected()),this,SLOT(SocketConnected()));
}
CModbusMaster::~CModbusMaster()
{
if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState)
{
mModbusTCPSocketHandle->disconnectFromHost();
mModbusTCPSocketHandle->waitForDisconnected(1000);
}
delete mModbusTCPSocketHandle;
}
int CModbusMaster::ConnectToSlave(QString SlaveIP, int SlavePort)
{
if(mModbusTCPSocketHandle->state() != QAbstractSocket::UnconnectedState)
{
return RET_ERROR;
}
mModbusTCPSocketHandle->connectToHost(SlaveIP,SlavePort);
return RET_OK;
}
int CModbusMaster::DisconnectFromSlave()
{
if(mModbusTCPSocketHandle->state() != QAbstractSocket::ConnectedState)
{
qDebug("Trying to disconnect a non connected socket");
mModbusTCPSocketHandle->disconnectFromHost();
return 0;
}
qDebug("Requesting Disconnection...");
mModbusTCPSocketHandle->disconnectFromHost();
return 1;
}
void CModbusMaster::SocketConnected()
{
emit ModbusMasterConnected(this);
qDebug("Master: Connection established with slave");
}
void CModbusMaster::SocketDisconnected()
{
ModbusLinkDisconnected();
emit ModbusMasterDisconnected(this);
mModbusTCPSocketHandle->flush();
}
int CModbusMaster::ReadModbusRegisters()
{
return SendReadHoldingRegistersRequest(MODBUS_ZT_DATA_BASE_REG,MODBUS_ZT_TABLE_DATA_SIZE); //Read all registers from ZT (2000 - 2027)
}
void CModbusMaster::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length)
{
emit ModbusMasterRepositoryUpdated();
// qDebug("Database updated with ZT data...");
}
void CModbusMaster::ModbusResponseException(quint8 ExceptionCode, quint8 FctCode)
{
qDebug("Modbus MASTER exception: code:%d Fct:%d",ExceptionCode,FctCode);
}
int CModbusMaster::SendAN1ToZT()
{
//return SendWriteHoldingRegistersRequest(CC_AN1_REGISTER_ADDRESS,1);
return SendWriteSingleRegisterRequest(MODBUS_CC_AN_BASE_REG_ADD);
}
int CModbusMaster::SendAN2ToZT()
{
//return SendWriteHoldingRegistersRequest(CC_AN2_REGISTER_ADDRESS,1);
return SendWriteSingleRegisterRequest(MODBUS_CC_AN_BASE_REG_ADD);
}
int CModbusMaster::SendWatchdog()
{
return SendWriteSingleRegisterRequest(MODBUS_CC_WATCHDOG_BASE_REG_ADD);
}
int CModbusMaster::SendDateTime()
{
return SendWriteHoldingRegistersRequest(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD,5);
}
int CModbusMaster::SendTrainData()
{
return SendWriteHoldingRegistersRequest(MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD,8);
}
int CModbusMaster::SendZTInhibitionData()
{
return SendWriteSingleRegisterRequest(MODBUS_CC_AN_BASE_REG_ADD);
}

41
Sources/ModbusMaster.h Normal file
View File

@ -0,0 +1,41 @@
#ifndef CMODBUSMASTER_H
#define CMODBUSMASTER_H
#include <QObject>
#include "ModbusBackend.h"
class CModbusMaster : public CModbusBackend
{
Q_OBJECT
public:
explicit CModbusMaster(CModbusRepository *Repo);
~CModbusMaster();
int ConnectToSlave(QString SlaveIP, int SlavePort);
int DisconnectFromSlave();
int ReadModbusRegisters();
int SendAN1ToZT();
int SendAN2ToZT();
int SendWatchdog();
int SendDateTime();
int SendTrainData();
int SendZTInhibitionData();
virtual void RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length);
virtual void ModbusResponseException(quint8 ExceptionCode, quint8 FctCode);
signals:
void ModbusMasterConnected(CModbusMaster *);
void ModbusMasterDisconnected(CModbusMaster *);
void ModbusMasterRepositoryUpdated();
void ModbusTransaction();
public slots:
void SocketConnected();
void SocketDisconnected();
};
#endif // CMODBUSMASTER_H

509
Sources/ModbusPage.cpp Normal file
View File

@ -0,0 +1,509 @@
#include "ModbusPage.h"
#include "ui_CModbusPage.h"
#include <QFont>
#include <QPalette>
#include "OutilModbus.h"
#include <QMessageBox>
#include <QFont>
CModbusPage::CModbusPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::CModbusPage)
{
mProgramHandle = 0;
ui->setupUi(this);
QFont font;
font.setPointSize(18);
ui->mSimCCTitleLabel->setFont(font);
ui->mSimCCTitleLabel->setAlignment(Qt::AlignCenter);
QPalette pal = QPalette(ui->mSimCCTitleLabel->palette());
pal.setColor(QPalette::WindowText,QColor(Qt::darkBlue));
ui->mSimCCTitleLabel->setPalette(pal);
ui->mCCEventsList->show();
pal.setColor(QPalette::WindowText,Qt::darkGreen);
ui->mPPI1ZT1AlarmLabel->setPalette(pal);
ui->mPPEZT1AlarmLabel->setPalette(pal);
ui->mFNZT1AlarmLabel->setPalette(pal);
ui->mPGZT1AlarmLabel->setPalette(pal);
ui->mV00AlarmLabel->setPalette(pal);
ui->mPEQ1AlarmLabel->setPalette(pal);
ui->mPPIZT2AlarmLabel->setPalette(pal);
ui->mPPEZT2AlarmLabel->setPalette(pal);
ui->mV02AlarmLabel->setPalette(pal);
ui->mPEQ2AlarmLabel->setPalette(pal);
connect(ui->mConnectBtn,SIGNAL(clicked()),this,SLOT(ConnectToSlaveBtnClicked()));
connect(ui->mSendModbusReadBtn,SIGNAL(clicked()),this,SLOT(ReadModbusBtnClicked()));
connect(ui->mAN1Btn,SIGNAL(clicked()),this,SLOT(SendAN1BtnClicked()));
connect(ui->mAN2Btn,SIGNAL(clicked()),this,SLOT(SendAN2BtnClicked()));
connect(ui->mDateTimeBtn,SIGNAL(clicked()),this,SLOT(SendDateTimeBtnClicked()));
connect(ui->mSetTrainParamBtn,SIGNAL(clicked()),this,SLOT(SendTrainInfoBtnClicked()));
connect(ui->mAutoRequestChkBx,SIGNAL(stateChanged(int)),this,SLOT(AutoSendRequestsCheckboxClicked(int)));
connect(ui->mStayOnTopChkBx,SIGNAL(stateChanged(int)),this,SLOT(StayOnTopBtnClicked(int)));
ui->mCCModbusTable->hide();
ui->mWatchdogChkBx->setCheckState(Qt::Checked);
connect(ui->mWatchdogChkBx,SIGNAL(stateChanged(int)),this,SLOT(WatchdogChkBxChanged(int)));
QList<QTreeWidgetItem *> Items;
ui->mCCModbusDataTree->setColumnCount(3);
ui->mCCModbusDataTree->setHeaderItem(new QTreeWidgetItem(QStringList()<<"Flag/Alarme"<<"Valeur"<<"Rang"));
//Items.append(new QTreeWidgetItem(QStringList(QString().fromUtf8("Pneu De Guidage ZT1 #2") << QString().fromUtf8("Pneu De Guidage ZT1 #2") << QString().fromUtf8("Pneu De Guidage ZT1 #2"))));
Items.append(new QTreeWidgetItem(QStringList()<<"ZT1"));
Items.append(new QTreeWidgetItem(QStringList()<<"ZT2"));
Items.append(new QTreeWidgetItem(QStringList()<<"ZT"));
QTreeWidgetItem* Item;
// Item = new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Alarmes"));
// Items.at(0)->addChild(Item);
Item = Items.at(0);
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #4")<<"0"<<"---"));
Item ->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Itinéraire")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Alarme V00 ZT1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Panne Équipement ZT1")<<"0"<<"---"));
Item = Items.at(1);
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #4")<<"0"<<"---"));
// Items.at(1)->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8(" ")));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Alarme V02 ZT2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Panne Équipement ZT2")<<"0"<<"---"));
Item = Items.at(2);
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Watchdog ZT")<<"0"<<"---"));
ui->mCCModbusDataTree->insertTopLevelItems(0,Items);
ui->mCCModbusDataTree->resizeColumnToContents(1);
ui->mCCModbusDataTree->expandAll();
ui->mCCModbusDataTree->resizeColumnToContents(0);
// ui->mCCModbusDataTree->topLevelItem(0)->addChild(new QTreeWidgetItem(QStringList() << "TEST" << "TEST"));
mLedONPixmap = QPixmap("./images/green-led-on-md.png").scaled(20,20);
mLedOFFPixmap = QPixmap("./images/green-led-off-md.png").scaled(20,20);
ui->mActivityBitmap->setPixmap(mLedOFFPixmap);
ui->mZT1TrainTypeBox->addItem("MR63");
ui->mZT1TrainTypeBox->addItem("MR73");
ui->mZT1TrainTypeBox->addItem("MPM10");
ui->mZT1TrainTypeBox->addItem("Travaux");
ui->mZT1TrainTypeBox->addItem("97");
ui->mZT1TrainTypeBox->addItem("98");
ui->mZT1TrainTypeBox->addItem("99");
ui->mZT2TrainTypeBox->addItem("MR63");
ui->mZT2TrainTypeBox->addItem("MR73");
ui->mZT2TrainTypeBox->addItem("MPM10");
ui->mZT2TrainTypeBox->addItem("Travaux");
ui->mZT2TrainTypeBox->addItem("97");
ui->mZT2TrainTypeBox->addItem("98");
ui->mZT2TrainTypeBox->addItem("99");
ui->mZT1Compo1->setValue(100);
ui->mZT1Compo2->setValue(200);
ui->mZT1Compo3->setValue(300);
ui->mZT2Compo1->setValue(100);
ui->mZT2Compo2->setValue(200);
ui->mZT2Compo3->setValue(300);
}
CModbusPage::~CModbusPage()
{
delete ui;
}
void CModbusPage::ConnectToSlaveBtnClicked()
{
if(ui->mConnectBtn->text() == QString::fromUtf8("Déconnecter"))
{
if(mProgramHandle->DisconnectCCFromZTButtonPressed() == 0)
{
MasterDisconnected();
}
}
else
{
bool OK = false;
QString IP = ui->mZTIPAddressLineEdit->text();
if(IP.isEmpty())
{
QMessageBox::warning(this,"Adresse IP invalide","Veuillez spécifier une adresse IP");
return;
}
int Port = ui->mZTPortLineEdit->text().toInt(&OK,10);
if(OK == false)
{
QMessageBox::warning(this,"Numéro de port invalide","Port invalide, vérifier le numéro de port");
return;
}
if(mProgramHandle->ConnectCCToZTButtonPressed(IP,Port) == 0)
{
QMessageBox::warning(this,"Paramètres invalides","Paramètres IP ou Port invalides.");
}
}
}
void CModbusPage::MasterConnected()
{
ui->mConnectBtn->setText(QString::fromUtf8("Déconnecter"));
}
void CModbusPage::MasterDisconnected()
{
ui->mConnectBtn->setText("Connecter");
ui->mAutoRequestChkBx->setChecked(false);
}
void CModbusPage::ReadModbusBtnClicked()
{
mProgramHandle->SendMasterReadCommand();
}
void CModbusPage::UpdateZTInfo(CZTInfo *DataStruct)
{
QTreeWidgetItem* Item;
QString TempStr;
//ZT1
Item = ui->mCCModbusDataTree->topLevelItem(0);
Item->child(0)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag1));
Item->child(1)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag2));
Item->child(2)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag3));
Item->child(3)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag4));
Item->child(4)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag1));
Item->child(5)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag2));
Item->child(6)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag3));
Item->child(7)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag4));
Item->child(8)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag1));
Item->child(9)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag2));
Item->child(10)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag3));
Item->child(11)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag4));
Item->child(12)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag1));
Item->child(13)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag2));
Item->child(14)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag3));
Item->child(15)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag4));
if(DataStruct->mITI10_12Flag == 0)
{
TempStr = "Principal";
}
else
{
TempStr = "Secondaire";
}
Item->child(16)->setText(1,TempStr);
Item->child(17)->setText(1,QString("%1").arg(DataStruct->mZT1V00AlarmFlag));
Item->child(18)->setText(1,QString("%1").arg(DataStruct->mZT1PEQ1AlarmFlag));
for(int i = 0; i < 16; i++)
{
Item->child(i)->setText(2,QString("%1").arg(DataStruct->mZT1Ranks.at(i)));
}
//ZT2
Item = ui->mCCModbusDataTree->topLevelItem(1);
Item->child(0)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag1));
Item->child(1)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag2));
Item->child(2)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag3));
Item->child(3)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag4));
Item->child(4)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag1));
Item->child(5)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag2));
Item->child(6)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag3));
Item->child(7)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag4));
Item->child(8)->setText(1,QString("%1").arg(DataStruct->mZT2V02AlarmFlag));
Item->child(9)->setText(1,QString("%1").arg(DataStruct->mZT2PEQ2AlarmFlag));
for(int i = 0; i < 8; i++)
{
Item->child(i)->setText(2,QString("%1").arg(DataStruct->mZT2Ranks.at(i)));
}
//Watchdog
Item = ui->mCCModbusDataTree->topLevelItem(2);
Item->child(0)->setText(1,QString("%1").arg(DataStruct->mWatchdogZT));
// QPalette OffPal = QPalette(ui->mSimCCTitleLabel->palette());
// QPalette OnPal = QPalette(ui->mSimCCTitleLabel->palette());
// OffPal.setColor(QPalette::WindowText,Qt::darkGreen);
// OnPal.setColor(QPalette::WindowText,Qt::red);
// if(DataStruct->mZT1PPIAlarm == 1)
// {
// ui->mPPI1ZT1AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPPI1ZT1AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT1PPEAlarm == 1)
// {
// ui->mPPEZT1AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPPEZT1AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT1FNAlarm == 1)
// {
// ui->mFNZT1AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mFNZT1AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT1PGAlarm == 1)
// {
// ui->mPGZT1AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPGZT1AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT1V00Alarm == 1)
// {
// ui->mV00AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mV00AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->ZT1PEQ1Alarm == 1)
// {
// ui->mPEQ1AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPEQ1AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT2PPIAlarm == 1)
// {
// ui->mPPIZT2AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPPIZT2AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT2PPEAlarm == 1)
// {
// ui->mPPEZT2AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPPEZT2AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT2V02Alarm == 1)
// {
// ui->mV02AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mV02AlarmLabel->setPalette(OffPal);
// }
// if(DataStruct->mZT2PEQ2Alarm == 1)
// {
// ui->mPEQ2AlarmLabel->setPalette(OnPal);
// }
// else
// {
// ui->mPEQ2AlarmLabel->setPalette(OffPal);
// }
// ui->mZT1RangAlarmeLabel->setText(QString("%1").arg(DataStruct->mZT1RangPP_PG));
// ui->mZT1RangFNLabel->setText(QString("%1").arg(DataStruct->mZT1RangFN));
// ui->mZT2RangAlarmeLabel->setText(QString("%1").arg(DataStruct->mZT2RangPP));
}
void CModbusPage::SendAN1BtnClicked()
{
mProgramHandle->SendAN1Request();
}
void CModbusPage::SendAN2BtnClicked()
{
mProgramHandle->SendAN2Request();
}
void CModbusPage::AutoSendRequestsCheckboxClicked(int state)
{
if(state == Qt::Checked)
{
int delay = ui->mZTAutoReqDelay->text().toInt();
mProgramHandle->SetAutoRequestMode(true,delay);
}
else
{
mProgramHandle->SetAutoRequestMode(false,0);
}
}
void CModbusPage::StayOnTopBtnClicked(int state)
{
if(state == Qt::Checked)
{
Qt::WindowFlags flags = window()->windowFlags();
flags |= Qt::WindowStaysOnTopHint;
window()->setWindowFlags(flags);
window()->show();
}
else
{
Qt::WindowFlags flags = window()->windowFlags();
flags &= ~Qt::WindowStaysOnTopHint;
window()->setWindowFlags(flags);
window()->show();
}
}
void CModbusPage::ModbusActivity()
{
static bool IsON = false;
if(IsON)
{
ui->mActivityBitmap->setPixmap(mLedOFFPixmap);
IsON = false;
}
else
{
ui->mActivityBitmap->setPixmap(mLedONPixmap);
IsON = true;
}
}
void CModbusPage::WatchdogChkBxChanged(int state)
{
if(state == Qt::Checked)
{
mProgramHandle->EnableWatchdog(true);
}
else
{
mProgramHandle->EnableWatchdog(false);
}
}
void CModbusPage::SendDateTimeBtnClicked()
{
mProgramHandle->SendDateTime();
}
void CModbusPage::SendTrainInfoBtnClicked()
{
QList<qint16> TrainInfo;
qint16 ZT1Type = 95;
if(ui->mZT1TrainTypeBox->currentText() == "MR63")
ZT1Type = 63;
else if(ui->mZT1TrainTypeBox->currentText() == "MR73")
ZT1Type = 73;
else if(ui->mZT1TrainTypeBox->currentText() == "MPM10")
ZT1Type = 10;
else if(ui->mZT1TrainTypeBox->currentText() == "Travaux")
ZT1Type = 0;
else if(ui->mZT1TrainTypeBox->currentText() == "97")
ZT1Type = 97;
else if(ui->mZT1TrainTypeBox->currentText() == "98")
ZT1Type = 98;
else if(ui->mZT1TrainTypeBox->currentText() == "99")
ZT1Type = 99;
qint16 ZT2Type = 95;
if(ui->mZT2TrainTypeBox->currentText() == "MR63")
ZT2Type = 63;
else if(ui->mZT2TrainTypeBox->currentText() == "MR73")
ZT2Type = 73;
else if(ui->mZT2TrainTypeBox->currentText() == "MPM10")
ZT2Type = 10;
else if(ui->mZT2TrainTypeBox->currentText() == "Travaux")
ZT2Type = 0;
else if(ui->mZT2TrainTypeBox->currentText() == "97")
ZT2Type = 97;
else if(ui->mZT2TrainTypeBox->currentText() == "98")
ZT2Type = 98;
else if(ui->mZT2TrainTypeBox->currentText() == "99")
ZT2Type = 99;
TrainInfo.append(ZT1Type);
TrainInfo.append(ZT2Type);
TrainInfo.append(ui->mZT1Compo1->value());
TrainInfo.append(ui->mZT1Compo2->value());
TrainInfo.append(ui->mZT1Compo3->value());
TrainInfo.append(ui->mZT2Compo1->value());
TrainInfo.append(ui->mZT2Compo2->value());
TrainInfo.append(ui->mZT2Compo3->value());
qint16 InhibZT1 = 0, InhibZT2 = 0;
if(ui->mZT1InhibPassChkBx->checkState() == Qt::Checked)
{
InhibZT1 = 1;
}
if(ui->mZT2InhibPassChkBx->checkState() == Qt::Checked)
{
InhibZT2 = 1;
}
mProgramHandle->SendTrainInfo(TrainInfo);
mProgramHandle->SendInhibitZT(InhibZT1,InhibZT2);
}

44
Sources/ModbusPage.h Normal file
View File

@ -0,0 +1,44 @@
#ifndef CMAINPAGE_H
#define CMAINPAGE_H
#include "ZTInfo.h"
#include <QPixmap>
#include <QWidget>
class COutilModbus;
namespace Ui {
class CModbusPage;
}
class CModbusPage : public QWidget
{
Q_OBJECT
public:
explicit CModbusPage(QWidget *parent = 0);
~CModbusPage();
void MasterConnected();
void MasterDisconnected();
COutilModbus *mProgramHandle;
QPixmap mLedONPixmap, mLedOFFPixmap;
void UpdateZTInfo(CZTInfo *DataStruct);
private:
Ui::CModbusPage *ui;
public slots:
void ConnectToSlaveBtnClicked();
void ReadModbusBtnClicked();
void SendAN1BtnClicked();
void SendAN2BtnClicked();
void SendDateTimeBtnClicked();
void AutoSendRequestsCheckboxClicked(int);
void StayOnTopBtnClicked(int);
void ModbusActivity();
void WatchdogChkBxChanged(int);
void SendTrainInfoBtnClicked();
};
#endif // CMAINPAGE_H

View File

@ -0,0 +1,211 @@
#include "ModbusRepository.h"
#include <QByteArray>
#include <QBuffer>
#include <QDataStream>
CModbusRepository::CModbusRepository()
{
}
int CModbusRepository::AddHRDataMap(quint16 StartAddress, quint16 Length)
{
for(int i= 0; i < mHoldingRegisters.size(); i++)
{
if((StartAddress >= mHoldingRegisters.at(i).mStartAddress && StartAddress <= mHoldingRegisters.at(i).mEndAddress) ||
(StartAddress + Length - 1 >= mHoldingRegisters.at(i).mStartAddress && StartAddress + Length - 1 <= mHoldingRegisters.at(i).mEndAddress))
{
return RET_ERROR; //The data map overlaps an existing map.
}
}
CHRDataMap NewHRMap(StartAddress,Length);
mHoldingRegisters.append(NewHRMap);
qDebug("Created a new HR data map at address: %d with size %d",StartAddress,Length);
return RET_OK;
}
bool CModbusRepository::IsHRValid(quint16 StartAddress, quint16 Length, int *index)
{
for(int i= 0; i < mHoldingRegisters.size(); i++)
{
if((StartAddress >= mHoldingRegisters.at(i).mStartAddress && StartAddress + Length - 1 <= mHoldingRegisters.at(i).mEndAddress))
{
if(index != 0)
{
*index = i;
}
return true;
}
}
return false;
}
QByteArray CModbusRepository::GetHRData(quint16 StartAddress, quint16 Length, bool *OK)
{
QByteArray Data;
int RegisterIndex = 0;
if(IsHRValid(StartAddress,Length, &RegisterIndex) == false)
{
if(OK != 0)
{
*OK = false;
}
}
else
{
int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
for(int i = 0; i < Length; i++)
{
quint16 CurReg = mHoldingRegisters.at(RegisterIndex).mRegistersData.at(DataIndex++);
quint8 HighByte, LowByte;
LowByte = CurReg & 0x00FF;
HighByte = (CurReg >> 8) & 0x00FF;
Data.append(HighByte);
Data.append(LowByte);
}
if(OK != 0)
{
*OK = true;
}
}
return Data;
}
int CModbusRepository::WriteHRData(quint16 StartAddress, quint16 Length, QByteArray Data)
{
int RegisterIndex;
if(IsHRValid(StartAddress,Length, &RegisterIndex) == false)
{
return RET_ERROR;
}
if(Length*2 != Data.size())
{
return RET_ERROR;
}
int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
for(int i = 0; i < Length; i++)
{
quint8 HighByte = Data.at(i*2);
quint8 LowByte = Data.at(i*2 + 1);
qint16 Word = HighByte;
Word <<= 8;
Word += LowByte;
Word = Word &0xFFFF;
mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex++] = Word;
}
return RET_OK;
}
int CModbusRepository::WriteSingleReg(quint16 Address, quint16 Value)
{
int RegisterIndex;
if(IsHRValid(Address,1, &RegisterIndex) == false)
{
return RET_ERROR;
}
int DataIndex = Address - mHoldingRegisters.at(RegisterIndex).mStartAddress;
mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex] = Value;
return RET_OK;
}
quint16 CModbusRepository::GetSingleReg(quint16 Address, bool *OK)
{
int RegisterIndex;
if(IsHRValid(Address,1, &RegisterIndex) == false)
{
if(OK != 0)
{
*OK = false;
}
return 0;
}
if(OK != 0)
{
*OK = true;
}
int DataIndex = Address - mHoldingRegisters.at(RegisterIndex).mStartAddress;
return mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex];
}
QList<qint16> CModbusRepository::GetRegs(quint16 StartAddress, quint16 Length, bool *OK)
{
int RegisterIndex;
if(IsHRValid(StartAddress,Length, &RegisterIndex) == false)
{
if(OK != 0)
{
*OK = false;
}
return QList<qint16>();
}
if(OK != 0)
{
*OK = true;
}
int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
return mHoldingRegisters[RegisterIndex].mRegistersData.mid(DataIndex,Length);
}
CHRDataMap::CHRDataMap(quint16 StartAddress, quint16 Length)
{
mStartAddress = StartAddress;
mLength = Length;
for(int i = 0; i < Length; i++)
{
mRegistersData.append(0);
}
/*
mRegistersData[0] = 0x1234;
mRegistersData[1] = 0x4567;
mRegistersData[2] = 0x8911;
mRegistersData[3] = 9873;
mRegistersData[4] = 0xABCD;*/
mEndAddress = StartAddress + Length - 1;
}
int CModbusRepository::WriteMultipleRegs(quint16 StartAddress, QList<qint16> Data)
{
int RegisterIndex;
if(IsHRValid(StartAddress,Data.size(), &RegisterIndex) == false)
{
return RET_ERROR;
}
//mMutex.lockForWrite();
int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
for(int i = 0; i < Data.size(); i++)
{
mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex++] = Data.at(i);
}
// mMutex.unlock();
// emit RepoChanged(StartAddress,Data.size());
return RET_OK;
}

View File

@ -0,0 +1,35 @@
#ifndef MODBUSREPOSITORY_H
#define MODBUSREPOSITORY_H
#include "GlobalDefine.h"
#include <QList>
class CHRDataMap ///Holding Register data map.
{
public:
CHRDataMap(quint16 StartAddress, quint16 Length);
quint16 mStartAddress,mEndAddress;
quint16 mLength;
QList<qint16> mRegistersData;
};
class CModbusRepository
{
public:
CModbusRepository();
//Holding Registers
int AddHRDataMap(quint16 StartAddress, quint16 Length);
bool IsHRValid(quint16 StartAddress, quint16 Length, int *index = 0);
QByteArray GetHRData(quint16 StartAddress, quint16 Length, bool *OK = 0);
QList<qint16> GetRegs(quint16 StartAddress, quint16 Length, bool *OK = 0);
quint16 GetSingleReg(quint16 Address, bool *OK = 0);
int WriteHRData(quint16 StartAddress, quint16 Length, QByteArray Data);
int WriteSingleReg(quint16 Address, quint16 Value);
int WriteMultipleRegs(quint16 StartAddress, QList<qint16> Data);
private:
QList<CHRDataMap> mHoldingRegisters;
};
#endif // MODBUSREPOSITORY_H

100
Sources/ModbusSlave.cpp Normal file
View File

@ -0,0 +1,100 @@
#include "ModbusSlave.h"
CModbusSlave::CModbusSlave(CModbusRepository *Repo) :
CModbusBackend(Repo)
{
mModbusServer = new QTcpServer();
connect(mModbusServer,SIGNAL(newConnection()),this,SLOT(NewModbusConnection()));
mModbusMode = MODBUS_SLAVE_MODE;
mServerPort = -1;
}
CModbusSlave::~CModbusSlave()
{
delete mModbusServer;
}
int CModbusSlave::SetServerPort(int port)
{
mServerPort = port;
return 1;
}
bool CModbusSlave::IsSlaveServerOpened()
{
return mModbusServer->isListening();
}
int CModbusSlave::StartSlaveServer(int port)
{
mServerPort = port;
mModbusServer->listen(QHostAddress::Any,port);
qDebug("Slave server started on port %d",port);
return 1;
}
int CModbusSlave::ToggleServerState()
{
if(mModbusServer->isListening())
{
StopSlaveServer();
}
else
{
if(mServerPort < 0)
{
qDebug("Error, trying to toggle SEI server on invalid port");
return 0;
}
StartSlaveServer(mServerPort);
}
return 1;
}
int CModbusSlave::StopSlaveServer()
{
if(mModbusTCPSocketHandle != 0)
{
mModbusTCPSocketHandle->disconnectFromHost();
}
mModbusServer->close();
return 1;
}
void CModbusSlave::NewModbusConnection()
{
mModbusTCPSocketHandle = mModbusServer->nextPendingConnection();
if(mModbusTCPSocketHandle != 0)
{
mDataLinkValid = true;
connect(mModbusTCPSocketHandle,SIGNAL(readyRead()),this,SLOT(ModbusDataReady()));
connect(mModbusTCPSocketHandle,SIGNAL(disconnected()),this,SLOT(ModbusSocketDisconnected()));
emit ModbusSlaveConnected(this);
qDebug("Slave: Connection with Master established");
}
}
void CModbusSlave::ModbusSocketDisconnected()
{
qDebug("Modbus link disconnected");
mDataLinkValid = false;
emit ModbusSlaveDisconnected(this);
}
void CModbusSlave::RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length)
{
// qDebug("SEI Database updated with ZT data...");
emit ModbusSlaveRepoUpdated();
}
void CModbusSlave::ModbusRequestException(quint8 ExceptionCode, quint8 FctCode)
{
}

41
Sources/ModbusSlave.h Normal file
View File

@ -0,0 +1,41 @@
#ifndef CMODBUSSLAVE_H
#define CMODBUSSLAVE_H
#include <QObject>
#include "ModbusBackend.h"
#include <QTcpServer>
#include "ModbusRepository.h"
class CModbusSlave : public CModbusBackend
{
Q_OBJECT
public:
explicit CModbusSlave(CModbusRepository *Repo);
virtual ~CModbusSlave();
int SetServerPort(int port);
int StartSlaveServer(int port);
int StopSlaveServer();
virtual void RegistersDatabaseUpdated(quint16 StartAddress, quint16 Length);
virtual void ModbusRequestException(quint8 ExceptionCode, quint8 FctCode);
int ToggleServerState();
bool IsSlaveServerOpened();
private:
QTcpServer *mModbusServer;
int mServerPort;
signals:
void ModbusSlaveConnected(CModbusSlave *);
void ModbusSlaveDisconnected(CModbusSlave *);
void ModbusSlaveRepoUpdated();
public slots:
void NewModbusConnection();
void ModbusSocketDisconnected();
};
#endif // CMODBUSSLAVE_H

570
Sources/OutilModbus.cpp Normal file
View File

@ -0,0 +1,570 @@
#include "OutilModbus.h"
#include "ProtocolDefs.h"
#include <QDateTime>
COutilModbus::COutilModbus(QObject *parent) :
QObject(parent)
{
mModbusSEIEmulator = new CModbusSlave(&mSEIModbusRepo);
mModbusCCEmulator = new CModbusMaster(&mCCModbusRepo);
w = new MainWindow(0,this);
mAutoRequestTimer = new QTimer();
mAutoRequestTimer->setSingleShot(false);
connect(mAutoRequestTimer,SIGNAL(timeout()),this,SLOT(AutoRequestTimeExpired()));
mWatchdogEnabled = true;
mWatchdog = 0;
mWatchdogTimer = new QTimer();
mWatchdogTimer->setSingleShot(false);
connect(mWatchdogTimer,SIGNAL(timeout()),this,SLOT(WatchdogTimerExpired()));
mWatchdogTimer->setInterval(MODBUS_CC_WATCHDOG_TIMEOUT);
mSEIWatchdogTimer = new QTimer();
mSEIWatchdogTimer->setSingleShot(false);
mSEIWatchdogTimer->setInterval(MODBUS_SEI_WATCHDOG_TIMEOUT);
connect(mSEIWatchdogTimer,SIGNAL(timeout()),this,SLOT(SEIWatchdogExpired()));
mSEIWatchdogValue = 0;
}
COutilModbus::~COutilModbus()
{
delete mModbusSEIEmulator;
delete mAutoRequestTimer;
delete mWatchdogTimer;
delete w;
delete mSEIWatchdogTimer;
}
int COutilModbus::Start()
{
w->resize(1024,768);
w->show();
mModbusPageHandle = w->mModbusPage;
mSEIModbusPageHandle = w->mSEIModbusPage;
mCCModbusRepo.AddHRDataMap(2000,128);
//mModbusSEIEmulator->StartSlaveServer(502);
mModbusSEIEmulator->SetServerPort(503);
mSEIModbusRepo.AddHRDataMap(2000,128);
mSEIModbusRepo.AddHRDataMap(3000,128);
connect(mModbusCCEmulator,SIGNAL(ModbusMasterConnected(CModbusMaster*)),this,SLOT(ModbusMasterConnected(CModbusMaster*)));
connect(mModbusCCEmulator,SIGNAL(ModbusMasterDisconnected(CModbusMaster*)),this,SLOT(ModbusMasterDisconnected(CModbusMaster*)));
connect(mModbusCCEmulator,SIGNAL(ModbusMasterRepositoryUpdated()),this,SLOT(ModbusMasterRepositoryUpdated()));
connect(mModbusCCEmulator,SIGNAL(ModbusRX()),mModbusPageHandle,SLOT(ModbusActivity()));
connect(mModbusSEIEmulator,SIGNAL(ModbusSlaveConnected(CModbusSlave*)),this,SLOT(SEIModbusConnected(CModbusSlave*)));
connect(mModbusSEIEmulator,SIGNAL(ModbusSlaveDisconnected(CModbusSlave*)),this,SLOT(SEIModbusDisconnected(CModbusSlave*)));
connect(mModbusSEIEmulator,SIGNAL(ModbusSlaveRepoUpdated()),this,SLOT(SEIRepositoryUpdated()));
return 1;
}
void COutilModbus::ModbusMasterConnected(CModbusMaster *Master)
{
mModbusPageHandle->MasterConnected();
mAutoRequestTimer->stop();
if(mWatchdogEnabled)
{
mWatchdogTimer->start();
}
}
void COutilModbus::ModbusMasterDisconnected(CModbusMaster *Master)
{
mModbusPageHandle->MasterDisconnected();
mWatchdogTimer->stop();
mAutoRequestTimer->stop();
}
void COutilModbus::ModbusMasterRepositoryUpdated()
{
if(UpdateZTInfo(&mCurZTInfo,&mCCModbusRepo) == RET_OK)
{
mModbusPageHandle->UpdateZTInfo(&mCurZTInfo);
}
}
void COutilModbus::SEIModbusConnected(CModbusSlave *Slave)
{
mSEIModbusPageHandle->SetConnected(true);
}
void COutilModbus::SEIModbusDisconnected(CModbusSlave *Slave)
{
mSEIModbusPageHandle->SetConnected(false);
}
void COutilModbus::SEIRepositoryUpdated()
{
if(UpdateZTInfo(&mCurZTInfo, &mSEIModbusRepo) == RET_OK)
{
mSEIModbusPageHandle->UpdateZTInfo(&mCurZTInfo);
}
}
int COutilModbus::ConnectCCToZTButtonPressed(QString IP, int Port)
{
mModbusCCEmulator->ConnectToSlave(IP,Port);
return 1;
}
int COutilModbus::DisconnectCCFromZTButtonPressed()
{
return mModbusCCEmulator->DisconnectFromSlave();
}
int COutilModbus::SetCCReqDelay(int delay)
{
return 1;
}
int COutilModbus::SendMasterReadCommand()
{
return mModbusCCEmulator->ReadModbusRegisters();
}
int COutilModbus::UpdateZTInfo(CZTInfo *DataStruct, CModbusRepository *SourceRepo)
{
bool OK = false;
// quint16 data = mCCModbusRepo.GetSingleReg(MODBUS_ZT1_ALARM_DATA_BASE_REG_ADD,&OK);
quint16 data = SourceRepo->GetSingleReg(MODBUS_ZT1_ALARM_DATA_BASE_REG_ADD,&OK);
if(OK == true)
{
DataStruct->mZT1PPIAlarmFlag1 = (data & ZT1_PP_INT_FLAG_MASK_1) != 0;
DataStruct->mZT1PPIAlarmFlag2 = (data & ZT1_PP_INT_FLAG_MASK_2) != 0;
DataStruct->mZT1PPIAlarmFlag3 = (data & ZT1_PP_INT_FLAG_MASK_3) != 0;
DataStruct->mZT1PPIAlarmFlag4 = (data & ZT1_PP_INT_FLAG_MASK_4) != 0;
DataStruct->mZT1PPEAlarmFlag1 = (data & ZT1_PP_EXT_FLAG_MASK_1) != 0;
DataStruct->mZT1PPEAlarmFlag2 = (data & ZT1_PP_EXT_FLAG_MASK_2) != 0;
DataStruct->mZT1PPEAlarmFlag3 = (data & ZT1_PP_EXT_FLAG_MASK_3) != 0;
DataStruct->mZT1PPEAlarmFlag4 = (data & ZT1_PP_EXT_FLAG_MASK_4) != 0;
DataStruct->mZT1PGAlarmFlag1 = (data & ZT1_PG_FLAG_MASK_1) != 0;
DataStruct->mZT1PGAlarmFlag2 = (data & ZT1_PG_FLAG_MASK_2) != 0;
DataStruct->mZT1PGAlarmFlag3 = (data & ZT1_PG_FLAG_MASK_3) != 0;
DataStruct->mZT1PGAlarmFlag4 = (data & ZT1_PG_FLAG_MASK_4) != 0;
DataStruct->mZT1FNAlarmFlag1 = (data & ZT1_FN_FLAG_MASK_1) != 0;
DataStruct->mZT1FNAlarmFlag2 = (data & ZT1_FN_FLAG_MASK_2) != 0;
DataStruct->mZT1FNAlarmFlag3 = (data & ZT1_FN_FLAG_MASK_3) != 0;
DataStruct->mZT1FNAlarmFlag4 = (data & ZT1_FN_FLAG_MASK_4) != 0;
}
else
{
qDebug("GetSingleReg failed in UpdateZTInfo (MODBUS_ZT1_ALARM_DATA_BASE_REG_ADD)");
return RET_ERROR;
}
QList<qint16> RankData;
RankData = SourceRepo->GetRegs(MODBUS_ZT1_ALARM_RANKS_BASE_ADD,16,&OK);
if(OK == true)
{
DataStruct->mZT1Ranks = RankData;
}
else
{
qDebug("GetSingleReg failed in UpdateZTInfo (MODBUS_ZT1_ALARM_RANKS_BASE_ADD)");
return RET_ERROR;
}
data = SourceRepo->GetSingleReg(MODBUS_ZT2_ALARM_DATA_BASE_REG_ADD,&OK);
if(OK == true)
{
DataStruct->mZT2PPIAlarmFlag1 = (data & ZT2_PP_INT_FLAG_MASK_1) != 0;
DataStruct->mZT2PPIAlarmFlag2 = (data & ZT2_PP_INT_FLAG_MASK_2) != 0;
DataStruct->mZT2PPIAlarmFlag3 = (data & ZT2_PP_INT_FLAG_MASK_3) != 0;
DataStruct->mZT2PPIAlarmFlag4 = (data & ZT2_PP_INT_FLAG_MASK_4) != 0;
DataStruct->mZT2PPEAlarmFlag1 = (data & ZT2_PP_EXT_FLAG_MASK_1) != 0;
DataStruct->mZT2PPEAlarmFlag2 = (data & ZT2_PP_EXT_FLAG_MASK_2) != 0;
DataStruct->mZT2PPEAlarmFlag3 = (data & ZT2_PP_EXT_FLAG_MASK_3) != 0;
DataStruct->mZT2PPEAlarmFlag4 = (data & ZT2_PP_EXT_FLAG_MASK_4) != 0;
}
else
{
qDebug("GetSingleReg failed in UpdateZTInfo (MODBUS_ZT2_ALARM_DATA_BASE_REG_ADD)");
return RET_ERROR;
}
RankData.clear();
RankData = SourceRepo->GetRegs(MODBUS_ZT2_ALARM_RANKS_BASE_ADD,8,&OK);
if(OK == true)
{
DataStruct->mZT2Ranks = RankData;
}
else
{
qDebug("GetSingleReg failed in UpdateZTInfo (MODBUS_ZT2_ALARM_RANKS_BASE_ADD)");
return RET_ERROR;
}
data = SourceRepo->GetSingleReg(MODBUS_MISC_DATA_BASE_REG_ADD,&OK);
if(OK == true)
{
DataStruct->mZT1V00AlarmFlag = (data & ZT1_V00_ALARM_FLAG_MASK) != 0;
DataStruct->mZT1PEQ1AlarmFlag = (data & ZT1_PEQ1_ALARM_FLAG_MASK) != 0;
DataStruct->mZT2V02AlarmFlag = (data & ZT2_V02_ALARM_FLAG_MASK) != 0;
DataStruct->mZT2PEQ2AlarmFlag = (data & ZT2_PEQ2_ALARM_FLAG_MASK) != 0;
DataStruct->mITI10_12Flag = (data & ZT1_ALARM_ITI_FLAG_MASK) != 0;
}
else
{
qDebug("GetSingleReg failed in UpdateZTInfo (MODBUS_PANNES_DATA_BASE_REG_ADD)");
return RET_ERROR;
}
DataStruct->mWatchdogZT = SourceRepo->GetSingleReg(MODBUS_ZT_WATCHDOG_REG_ADD,&OK);
return RET_OK;
}
int COutilModbus::SendAN1Request() //FCYCLE
{
bool OK = false;
quint16 AN1;
quint16 CurValue = mCCModbusRepo.GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
AN1 = CurValue & MODBUS_CC_FCYCLE_ZT1_FLAG_MASK;
if(OK == true)
{
if(AN1 == 0)
{
CurValue |= MODBUS_CC_FCYCLE_ZT1_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Setting FCYCLE in repo");
}
else
{
CurValue &= ~MODBUS_CC_FCYCLE_ZT1_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Clearing FCYCLE in repo");
}
mModbusCCEmulator->SendAN1ToZT();
}
return RET_OK;
}
int COutilModbus::SendAN2Request()
{
bool OK = false;
quint16 AN2;
quint16 CurValue = mCCModbusRepo.GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
AN2 = CurValue & MODBUS_CC_FCYCLE_ZT2_FLAG_MASK;
if(OK == true)
{
if(AN2 == 0)
{
CurValue |= MODBUS_CC_FCYCLE_ZT2_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Setting FCYCLE in repo");
}
else
{
CurValue &= ~MODBUS_CC_FCYCLE_ZT2_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Clearing FCYCLE in repo");
}
mModbusCCEmulator->SendAN2ToZT();
}
return RET_OK;
}
int COutilModbus::SendZTCZT1Request()
{
bool OK = false;
quint16 ZTC1;
quint16 CurValue = mCCModbusRepo.GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
ZTC1 = CurValue & MODBUS_CC_FCYCLE_ZT1_FLAG_MASK;
if(OK == true)
{
if(ZTC1 == 0)
{
CurValue |= MODBUS_CC_FCYCLE_ZT1_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Setting ZTC1 in repo");
}
else
{
CurValue ^= MODBUS_CC_FCYCLE_ZT1_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Clearing ZTC1 in repo");
}
mModbusCCEmulator->SendAN2ToZT();
}
return RET_OK;
}
int COutilModbus::SendZTCZT2Request()
{
bool OK = false;
quint16 ZTC2;
quint16 CurValue = mCCModbusRepo.GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
ZTC2 = CurValue & MODBUS_CC_FCYCLE_ZT2_FLAG_MASK;
if(OK == true)
{
if(ZTC2 == 0)
{
CurValue |= MODBUS_CC_FCYCLE_ZT2_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Setting ZTC2 in repo");
}
else
{
CurValue ^= MODBUS_CC_FCYCLE_ZT2_FLAG_MASK;
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,CurValue);
qDebug("Clearing ZTC2 in repo");
}
mModbusCCEmulator->SendAN2ToZT();
}
return RET_OK;
}
int COutilModbus::SetAutoRequestMode(bool Auto, int Delay)
{
if(Auto == false)
{
mAutoRequestTimer->stop();
}
else
{
mAutoRequestTimer->setInterval(Delay);
mAutoRequestTimer->start();
}
return RET_OK;
}
void COutilModbus::AutoRequestTimeExpired()
{
SendMasterReadCommand();
}
int COutilModbus::EnableWatchdog(bool Enabled)
{
mWatchdogEnabled = Enabled;
if(Enabled)
{
mWatchdogTimer->start();
}
else
{
mWatchdogTimer->stop();
}
return RET_OK;
}
void COutilModbus::WatchdogTimerExpired()
{
if(mWatchdog == 0)
{
mWatchdog = 1;
}
else
{
mWatchdog = 0;
}
mCCModbusRepo.WriteSingleReg(MODBUS_CC_WATCHDOG_BASE_REG_ADD,mWatchdog);
// qDebug("Watchdog: %d",mWatchdog);
mModbusCCEmulator->SendWatchdog();
}
int COutilModbus::SendDateTime()
{
QList<qint16> DateTimeData;
QDateTime CurDateTime = QDateTime::currentDateTime().toUTC();
qint16 tmpWord;
qint8 tmpByte;
DateTimeData.append(MODBUS_CC_CLK_UPDATE_FLAG_MASK);
tmpByte = DecToBCDByte((qint8)CurDateTime.time().second());
tmpWord = (qint16)tmpByte << 8;
DateTimeData.append(tmpWord);
tmpByte = DecToBCDByte((qint8)CurDateTime.time().hour());
tmpWord = (qint16)tmpByte << 8;
tmpByte = DecToBCDByte((qint8)CurDateTime.time().minute());
tmpWord += tmpByte;
DateTimeData.append(tmpWord);
tmpByte = DecToBCDByte((qint8)CurDateTime.date().month());
tmpWord = (qint16)tmpByte << 8;
tmpByte = DecToBCDByte((qint8)CurDateTime.date().day());
tmpWord += tmpByte;
DateTimeData.append(tmpWord);
tmpWord = DecToBCDWord((qint16)CurDateTime.date().year());
DateTimeData.append(tmpWord);
mCCModbusRepo.WriteMultipleRegs(MODBUS_CC_CLK_UPDATE_BASE_REG_ADD,DateTimeData);
mModbusCCEmulator->SendDateTime();
return RET_OK;
}
int COutilModbus::SendTrainInfo(QList<qint16> TrainInfo)
{
mCCModbusRepo.WriteMultipleRegs(MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD,TrainInfo);
mModbusCCEmulator->SendTrainData();
return RET_OK;
}
int COutilModbus::SendInhibitZT(qint16 InhibZT1, qint16 InhibZT2)
{
bool OK = false;
qint16 Register = mCCModbusRepo.GetSingleReg(MODBUS_CC_AN_BASE_REG_ADD,&OK);
if(OK)
{
if(InhibZT1 == 0)
{
Register &= ~MODBUS_CC_INHIBIT_ZT1_FLAG_MASK;
}
else
{
Register |= MODBUS_CC_INHIBIT_ZT1_FLAG_MASK;
}
if(InhibZT2 == 0)
{
Register &= ~MODBUS_CC_INHIBIT_ZT2_FLAG_MASK;
}
else
{
Register |= MODBUS_CC_INHIBIT_ZT2_FLAG_MASK;
}
mCCModbusRepo.WriteSingleReg(MODBUS_CC_AN_BASE_REG_ADD,Register);
mModbusCCEmulator->SendZTInhibitionData();
return RET_OK;
}
return RET_ERROR;
}
quint8 COutilModbus::DecToBCDByte(const quint8 byte)
{
quint8 out = 0;
out = ((byte/10) << 4) + (byte%10);
return out;
}
quint16 COutilModbus::DecToBCDWord(const quint16 word)
{
quint16 out = 0;
quint16 temp = 0;
out = word % 10;
temp = (((word /10) % 10) << 4);
out += temp;
temp = (((word / 100) % 10) << 8);
out += temp;
temp = (((word / 1000) % 10) << 12);
out += temp;
return out;
}
int COutilModbus::ToggleSEIServerState()
{
return mModbusSEIEmulator->ToggleServerState();
}
bool COutilModbus::IsSEIServerOpened()
{
return mModbusSEIEmulator->IsSlaveServerOpened();
}
int COutilModbus::SEIWatchdogEnable(bool Enabled)
{
if(Enabled)
{
mSEIWatchdogTimer->start();
}
else
{
mSEIWatchdogTimer->stop();
}
return RET_OK;
}
void COutilModbus::SEIWatchdogExpired()
{
if(mSEIWatchdogValue == 0)
{
mSEIWatchdogValue = SEI_MODBUS_SEI_WATCHDOG_MASK;
}
else
{
mSEIWatchdogValue = 0;
}
mSEIModbusRepo.WriteSingleReg(SEI_MODBUS_SEI_WATCHDOG_REG,mSEIWatchdogValue);
}
int COutilModbus::SEIAN1Toggle(bool Enabled)
{
qint16 temp;
bool OK;
temp = mSEIModbusRepo.GetSingleReg(SEI_MODBUS_SEI_ALARMS_RESET_REG,&OK);
if(OK == false)
{
qDebug("SEIAN1Toggle(): logic error in modbus table assignment. Can't read address %d",SEI_MODBUS_SEI_ALARMS_RESET_REG);
return RET_ERROR;
}
if(Enabled)
{
temp |= SEI_MODBUS_SEI_ZT1_ALARM_RESET_MASK;
}
else
{
temp &= ~SEI_MODBUS_SEI_ZT1_ALARM_RESET_MASK;
}
mSEIModbusRepo.WriteSingleReg(SEI_MODBUS_SEI_ALARMS_RESET_REG,temp);
return RET_OK;
}
int COutilModbus::SEIAN2Toggle(bool Enabled)
{
qint16 temp;
bool OK;
temp = mSEIModbusRepo.GetSingleReg(SEI_MODBUS_SEI_ALARMS_RESET_REG,&OK);
if(OK == false)
{
qDebug("SEIAN2Toggle(): logic error in modbus table assignment. Can't read address %d",SEI_MODBUS_SEI_ALARMS_RESET_REG);
return RET_ERROR;
}
if(Enabled)
{
temp |= SEI_MODBUS_SEI_ZT2_ALARM_RESET_MASK;
}
else
{
temp &= ~SEI_MODBUS_SEI_ZT2_ALARM_RESET_MASK;
}
mSEIModbusRepo.WriteSingleReg(SEI_MODBUS_SEI_ALARMS_RESET_REG,temp);
return RET_OK;
}

86
Sources/OutilModbus.h Normal file
View File

@ -0,0 +1,86 @@
#ifndef OUTILMODBUS_H
#define OUTILMODBUS_H
#include <QObject>
#include "ModbusSlave.h"
#include "ModbusMaster.h"
#include "MainWindow.h"
#include "ModbusRepository.h"
#include "ZTInfo.h"
class CMainPage;
class COutilModbus : public QObject
{
Q_OBJECT
public:
explicit COutilModbus(QObject *parent = 0);
~COutilModbus();
int Start();
MainWindow *w;
CModbusSlave *mModbusSEIEmulator;
CModbusMaster *mModbusCCEmulator;
CModbusRepository mSEIModbusRepo,mCCModbusRepo;
CZTInfo mCurZTInfo, mSEIZTInfo;
CModbusPage *mModbusPageHandle;
CSEIModbusPage *mSEIModbusPageHandle;
//Modules interfaces
//CMainPage
int ConnectCCToZTButtonPressed(QString IP, int Port);
int DisconnectCCFromZTButtonPressed();
int SetCCReqDelay(int delay);
int SendMasterReadCommand();
int UpdateZTInfo(CZTInfo *DataStruct, CModbusRepository* SourceRepo);
int SendAN1Request();
int SendAN2Request();
int SendZTCZT1Request();
int SendZTCZT2Request();
int SetAutoRequestMode(bool Auto, int Delay);
int EnableWatchdog(bool Enabled);
int SendDateTime();
int SendTrainInfo(QList<qint16> TrainInfo);
int SendInhibitZT(qint16 InhibZT1, qint16 InhibZT2);
int ToggleSEIServerState();
bool IsSEIServerOpened();
int SEIWatchdogEnable(bool Enabled);
int SEIAN1Toggle(bool Enabled);
int SEIAN2Toggle(bool Enabled);
private:
QTimer *mAutoRequestTimer;
QTimer *mWatchdogTimer;
bool mWatchdogEnabled;
qint16 mWatchdog;
QTimer *mSEIWatchdogTimer;
qint16 mSEIWatchdogValue;
quint16 DecToBCDWord(const quint16 word);
quint8 DecToBCDByte(const quint8 byte);
signals:
public slots:
void ModbusMasterConnected(CModbusMaster *);
void ModbusMasterDisconnected(CModbusMaster *);
void ModbusMasterRepositoryUpdated();
void SEIModbusConnected(CModbusSlave *);
void SEIModbusDisconnected(CModbusSlave *);
void SEIRepositoryUpdated();
void AutoRequestTimeExpired();
void WatchdogTimerExpired();
void SEIWatchdogExpired();
};
#endif // OUTILMODBUS_H

161
Sources/ProtocolDefs.h Normal file
View File

@ -0,0 +1,161 @@
#ifndef PROTOCOLDEFS_H
#define PROTOCOLDEFS_H
#define MODBUS_ZT_WATCHDOG_TIMEOUT 3000
#define MODBUS_CC_WATCHDOG_TIMEOUT 3000
#define MODBUS_SEI_WATCHDOG_TIMEOUT 1000
//ZT - CC modbus table masks
//Flags definitions for HR2000
#define ZT1_PP_INT_FLAG_MASK_1 0x0001
#define ZT1_PP_INT_FLAG_MASK_2 0x0002
#define ZT1_PP_INT_FLAG_MASK_3 0x0004
#define ZT1_PP_INT_FLAG_MASK_4 0x0008
#define ZT1_PP_EXT_FLAG_MASK_1 0x0010
#define ZT1_PP_EXT_FLAG_MASK_2 0x0020
#define ZT1_PP_EXT_FLAG_MASK_3 0x0040
#define ZT1_PP_EXT_FLAG_MASK_4 0x0080
#define ZT1_PG_FLAG_MASK_1 0x0100
#define ZT1_PG_FLAG_MASK_2 0x0200
#define ZT1_PG_FLAG_MASK_3 0x0400
#define ZT1_PG_FLAG_MASK_4 0x0800
#define ZT1_FN_FLAG_MASK_1 0x1000
#define ZT1_FN_FLAG_MASK_2 0x2000
#define ZT1_FN_FLAG_MASK_3 0x4000
#define ZT1_FN_FLAG_MASK_4 0x8000
//Flags definitions for HR2017
#define ZT2_PP_INT_FLAG_MASK_1 0x0001
#define ZT2_PP_INT_FLAG_MASK_2 0x0002
#define ZT2_PP_INT_FLAG_MASK_3 0x0004
#define ZT2_PP_INT_FLAG_MASK_4 0x0008
#define ZT2_PP_EXT_FLAG_MASK_1 0x0010
#define ZT2_PP_EXT_FLAG_MASK_2 0x0020
#define ZT2_PP_EXT_FLAG_MASK_3 0x0040
#define ZT2_PP_EXT_FLAG_MASK_4 0x0080
///UNUSED FLAGS NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_PG_DUMMY_MASK_1 0x0100 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_PG_DUMMY_MASK_2 0x0200 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_PG_DUMMY_MASK_3 0x0400 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_PG_DUMMY_MASK_4 0x0800 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_FN_DUMMY_MASK_5 0x1000 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_FN_DUMMY_MASK_6 0x2000 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_FN_DUMMY_MASK_7 0x4000 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT2_FV_DUMMY_MASK_8 0x8000 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
////////////////////////////////////////////////////////////////////
//Flags definitions for HR2026
#define ZT1_V00_ALARM_FLAG_MASK 0x0001
#define ZT1_PEQ1_ALARM_FLAG_MASK 0x0002
#define ZT2_V02_ALARM_FLAG_MASK 0x0004
#define ZT2_PEQ2_ALARM_FLAG_MASK 0x0008
#define ZT2_ALARM_ITI_DUMMY_FLAG_MASK 0x4000 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define ZT1_ALARM_ITI_FLAG_MASK 0x8000
//#define MODBUS_CC_AN1_FLAG_MASK 0x0002
//#define MODBUS_CC_AN2_FLAG_MASK 0x0001
//#define MODBUS_CC_AN_UNUSED_INVALID_MASK 0xFFFC
//#define MODBUS_CC_CLOCK_UPDATE_FLAG_MASK 0x0001
//#define MODBUS_CC_CLK_UNUSED_INV_MASK 0xFFFE
//Register addressing
//incoming
#define MODBUS_ZT_DATA_BASE_REG 2000
#define MODBUS_ZT_TABLE_DATA_SIZE 36 //Taille de la table = 36 registres
#define MODBUS_ZT1_ALARM_DATA_BASE_REG_ADD 2000
#define MODBUS_ZT2_ALARM_DATA_BASE_REG_ADD 2017
#define MODBUS_MISC_DATA_BASE_REG_ADD 2026
#define MODBUS_ZT_WATCHDOG_REG_ADD 2027
#define MODBUS_ZT1_ALARM_RANKS_BASE_ADD 2001
#define MODBUS_ZT1_RANK_PP_INT_1_REG_ADD 2001
#define MODBUS_ZT1_RANK_PP_INT_2_REG_ADD 2002
#define MODBUS_ZT1_RANK_PP_INT_3_REG_ADD 2003
#define MODBUS_ZT1_RANK_PP_INT_4_REG_ADD 2004
#define MODBUS_ZT1_RANK_PP_EXT_1_REG_ADD 2005
#define MODBUS_ZT1_RANK_PP_EXT_2_REG_ADD 2006
#define MODBUS_ZT1_RANK_PP_EXT_3_REG_ADD 2007
#define MODBUS_ZT1_RANK_PP_EXT_4_REG_ADD 2008
#define MODBUS_ZT1_RANK_PG_1_REG_ADD 2009
#define MODBUS_ZT1_RANK_PG_2_REG_ADD 2010
#define MODBUS_ZT1_RANK_PG_3_REG_ADD 2011
#define MODBUS_ZT1_RANK_PG_4_REG_ADD 2012
#define MODBUS_ZT1_RANK_FN_1_REG_ADD 2013
#define MODBUS_ZT1_RANK_FN_2_REG_ADD 2014
#define MODBUS_ZT1_RANK_FN_3_REG_ADD 2015
#define MODBUS_ZT1_RANK_FN_4_REG_ADD 2016
#define MODBUS_ZT2_ALARM_RANKS_BASE_ADD 2018
#define MODBUS_ZT2_RANK_PP_INT_1_REG_ADD 2018
#define MODBUS_ZT2_RANK_PP_INT_2_REG_ADD 2019
#define MODBUS_ZT2_RANK_PP_INT_3_REG_ADD 2020
#define MODBUS_ZT2_RANK_PP_INT_4_REG_ADD 2021
#define MODBUS_ZT2_RANK_PP_EXT_1_REG_ADD 2022
#define MODBUS_ZT2_RANK_PP_EXT_2_REG_ADD 2023
#define MODBUS_ZT2_RANK_PP_EXT_3_REG_ADD 2024
#define MODBUS_ZT2_RANK_PP_EXT_4_REG_ADD 2025
//UNUSED FLAGS NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_RK_PG_1_REG_ADD 2028 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_RK_PG_2_REG_ADD 2029 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_RK_PG_3_REG_ADD 2030 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_RK_PG_4_REG_ADD 2031 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_FN_PG_1_REG_ADD 2032 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_FN_PG_2_REG_ADD 2033 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_FN_PG_3_REG_ADD 2034 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
#define MODBUS_ZT2_DUMMY_FN_PG_4_REG_ADD 2035 //UNUSED FLAG NECESSARY FOR CC IMPLEMENTATION. MUST ALWAYS BE 0
///////////////////////////////////////////////////////////////////
//Outgoing
#define MODBUS_CC_FCYCLE_ZT1_FLAG_MASK 0x0001
#define MODBUS_CC_FCYCLE_ZT2_FLAG_MASK 0x0002
#define MODBUS_CC_INHIBIT_ZT1_FLAG_MASK 0x0004
#define MODBUS_CC_INHIBIT_ZT2_FLAG_MASK 0x0008
#define MODBUS_CC_CLK_UPDATE_FLAG_MASK 0x8000
#define MODBUS_CC_DATA_BASE_REG_ADD 2036
#define MODBUS_CC_TABLE_DATA_SIZE 15 //Taille de la table en écriture = 15 registres (2028 à 2042)
#define MODBUS_CC_WATCHDOG_BASE_REG_ADD 2036 //2028
#define MODBUS_CC_AN_BASE_REG_ADD 2037 //2029
#define MODBUS_CC_ZT1_TRAIN_TYPE_REG_ADD 2038 //2030
#define MODBUS_CC_ZT2_TRAIN_TYPE_REG_ADD 2039 //2031
#define MODBUS_CC_ZT1_TRAIN_ID_1_REG_ADD 2040//2032
#define MODBUS_CC_ZT1_TRAIN_ID_2_REG_ADD 2041 //2033
#define MODBUS_CC_ZT1_TRAIN_ID_3_REG_ADD 2042 //2034
#define MODBUS_CC_ZT2_TRAIN_ID_1_REG_ADD 2043 //2035
#define MODBUS_CC_ZT2_TRAIN_ID_2_REG_ADD 2044 //2036
#define MODBUS_CC_ZT2_TRAIN_ID_3_REG_ADD 2045 //2037
#define MODBUS_CC_CLK_UPDATE_BASE_REG_ADD 2046 //2038
#define MODUBS_CC_CLK_SEC_BASE_REG_ADD 2047 //2039
#define MODUBS_CC_CLK_HR_MIN_BASE_REG_ADD 2048 //2040
#define MODUBS_CC_CLK_MNT_DAY_BASE_REG_ADD 2049 //2041
#define MODUBS_CC_CLK_YEAR_BASE_REG_ADD 2050 //2042
#define SEI_MODBUS_ZT_DATA_BASE_REG 2000
#define SEI_MODBUS_ZT_TABLE_DATA_SIZE 28
#define SEI_MODBUS_SEI_DATA_BASE_REG 2037
#define SEI_MODBUS_SEI_TABLE_DATA_SIZE 2
#define SEI_MODBUS_ZT_WATCHDOG_REG 2027
#define SEI_MODBUS_SEI_WATCHDOG_REG 2038
#define SEI_MODBUS_SEI_WATCHDOG_MASK 0x0001
#define SEI_MODBUS_SEI_ALARMS_RESET_REG 2037
#define SEI_MODBUS_SEI_ZT1_ALARM_RESET_MASK 0X0001
#define SEI_MODBUS_SEI_ZT2_ALARM_RESET_MASK 0X0002
#endif // PROTOCOLDEFS_H

231
Sources/SEIModbusPage.cpp Normal file
View File

@ -0,0 +1,231 @@
#include "SEIModbusPage.h"
#include "ui_SEIModbusPage.h"
#include "OutilModbus.h"
CSEIModbusPage::CSEIModbusPage(QWidget *parent) :
QWidget(parent),
ui(new Ui::CSEIModbusPage)
{
ui->setupUi(this);
QFont font;
font.setPointSize(18);
ui->mSEISimTitleLabel->setFont(font);
ui->mSEISimTitleLabel->setAlignment(Qt::AlignCenter);
QPalette pal = QPalette(ui->mSEISimTitleLabel->palette());
pal.setColor(QPalette::WindowText,QColor(Qt::darkBlue));
ui->mSEISimTitleLabel->setPalette(pal);
SetConnected(false);
connect(ui->mStartStopServerBtn,SIGNAL(clicked()),this,SLOT(ServerStartStopPressed()));
connect(ui->mEnableWDChkBx,SIGNAL(toggled(bool)),this,SLOT(EnableWatchdogChkBxClicked()));
connect(ui->mAN1ChkBx,SIGNAL(toggled(bool)),this,SLOT(AN1ChkBoxToggled()));
connect(ui->mAN2ChkBx,SIGNAL(toggled(bool)),this,SLOT(AN2ChkBoxToggled()));
QList<QTreeWidgetItem *> Items;
ui->mZTAlarmDataTree->setColumnCount(3);
ui->mZTAlarmDataTree->setHeaderItem(new QTreeWidgetItem(QStringList()<<"Flag/Alarme"<<"Valeur"<<"Rang"));
//Items.append(new QTreeWidgetItem(QStringList(QString().fromUtf8("Pneu De Guidage ZT1 #2") << QString().fromUtf8("Pneu De Guidage ZT1 #2") << QString().fromUtf8("Pneu De Guidage ZT1 #2"))));
Items.append(new QTreeWidgetItem(QStringList()<<"ZT1"));
Items.append(new QTreeWidgetItem(QStringList()<<"ZT2"));
Items.append(new QTreeWidgetItem(QStringList()<<"ZT"));
QTreeWidgetItem* Item;
// Item = new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Alarmes"));
// Items.at(0)->addChild(Item);
Item = Items.at(0);
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT1 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT1 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu De Guidage ZT1 #4")<<"0"<<"---"));
Item ->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Frotteur Négatif ZT1 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Itinéraire")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Alarme V00 ZT1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Panne Équipement ZT1")<<"0"<<"---"));
Item = Items.at(1);
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Intérieur ZT2 #4")<<"0"<<"---"));
// Items.at(1)->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8(" ")));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #1")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #3")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Pneu Porteur Extérieur ZT2 #4")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Alarme V02 ZT2")<<"0"<<"---"));
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Panne Équipement ZT2")<<"0"<<"---"));
Item = Items.at(2);
Item->addChild(new QTreeWidgetItem(QStringList()<<QString().fromUtf8("Watchdog ZT")<<"0"<<"---"));
ui->mZTAlarmDataTree->insertTopLevelItems(0,Items);
ui->mZTAlarmDataTree->resizeColumnToContents(1);
ui->mZTAlarmDataTree->expandAll();
ui->mZTAlarmDataTree->resizeColumnToContents(0);
}
void CSEIModbusPage::UpdateZTInfo(CZTInfo *DataStruct)
{
QTreeWidgetItem* Item;
QString TempStr;
//ZT1
Item = ui->mZTAlarmDataTree->topLevelItem(0);
Item->child(0)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag1));
Item->child(1)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag2));
Item->child(2)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag3));
Item->child(3)->setText(1,QString("%1").arg(DataStruct->mZT1PPIAlarmFlag4));
Item->child(4)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag1));
Item->child(5)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag2));
Item->child(6)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag3));
Item->child(7)->setText(1,QString("%1").arg(DataStruct->mZT1PPEAlarmFlag4));
Item->child(8)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag1));
Item->child(9)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag2));
Item->child(10)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag3));
Item->child(11)->setText(1,QString("%1").arg(DataStruct->mZT1PGAlarmFlag4));
Item->child(12)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag1));
Item->child(13)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag2));
Item->child(14)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag3));
Item->child(15)->setText(1,QString("%1").arg(DataStruct->mZT1FNAlarmFlag4));
if(DataStruct->mITI10_12Flag == 0)
{
TempStr = "Principal";
}
else
{
TempStr = "Secondaire";
}
Item->child(16)->setText(1,TempStr);
Item->child(17)->setText(1,QString("%1").arg(DataStruct->mZT1V00AlarmFlag));
Item->child(18)->setText(1,QString("%1").arg(DataStruct->mZT1PEQ1AlarmFlag));
for(int i = 0; i < 16; i++)
{
Item->child(i)->setText(2,QString("%1").arg(DataStruct->mZT1Ranks.at(i)));
}
//ZT2
Item = ui->mZTAlarmDataTree->topLevelItem(1);
Item->child(0)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag1));
Item->child(1)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag2));
Item->child(2)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag3));
Item->child(3)->setText(1,QString("%1").arg(DataStruct->mZT2PPIAlarmFlag4));
Item->child(4)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag1));
Item->child(5)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag2));
Item->child(6)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag3));
Item->child(7)->setText(1,QString("%1").arg(DataStruct->mZT2PPEAlarmFlag4));
Item->child(8)->setText(1,QString("%1").arg(DataStruct->mZT2V02AlarmFlag));
Item->child(9)->setText(1,QString("%1").arg(DataStruct->mZT2PEQ2AlarmFlag));
for(int i = 0; i < 8; i++)
{
Item->child(i)->setText(2,QString("%1").arg(DataStruct->mZT2Ranks.at(i)));
}
//Watchdog
Item = ui->mZTAlarmDataTree->topLevelItem(2);
Item->child(0)->setText(1,QString("%1").arg(DataStruct->mWatchdogZT));
}
CSEIModbusPage::~CSEIModbusPage()
{
delete ui;
}
int CSEIModbusPage::SetConnected(bool Connected)
{
QFont font;
font.setPointSize(18);
font.setBold(true);
ui->mSEIConnectStatLabel->setFont(font);
ui->mSEIConnectStatLabel->setAlignment(Qt::AlignCenter);
QPalette pal = QPalette(ui->mSEIConnectStatLabel->palette());
if(Connected)
{
pal.setColor(QPalette::WindowText,QColor(Qt::green));
ui->mSEIConnectStatLabel->setPalette(pal);
ui->mSEIConnectStatLabel->setText("ZT: Connected");
}
else
{
pal.setColor(QPalette::WindowText,QColor(Qt::red));
ui->mSEIConnectStatLabel->setPalette(pal);
ui->mSEIConnectStatLabel->setText("ZT: Disconnected");
}
return 1;
}
void CSEIModbusPage::ServerStartStopPressed()
{
if(mProgramHandle->ToggleSEIServerState() != 0)
{
if(mProgramHandle->IsSEIServerOpened() == true)
{
ui->mStartStopServerBtn->setText("Arreter Serveur");
}
else
{
ui->mStartStopServerBtn->setText("Démarrer Serveur");
}
}
}
void CSEIModbusPage::EnableWatchdogChkBxClicked()
{
mProgramHandle->SEIWatchdogEnable(ui->mEnableWDChkBx->checkState() == Qt::Checked);
}
void CSEIModbusPage::AN1ChkBoxToggled()
{
mProgramHandle->SEIAN1Toggle(ui->mAN1ChkBx->checkState() == Qt::Checked);
}
void CSEIModbusPage::AN2ChkBoxToggled()
{
mProgramHandle->SEIAN2Toggle(ui->mAN2ChkBx->checkState() == Qt::Checked);
}

37
Sources/SEIModbusPage.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef SEIMODBUSPAGE_H
#define SEIMODBUSPAGE_H
#include <QWidget>
#include "ZTInfo.h"
class COutilModbus;
namespace Ui {
class CSEIModbusPage;
}
class CSEIModbusPage : public QWidget
{
Q_OBJECT
public:
explicit CSEIModbusPage(QWidget *parent = 0);
~CSEIModbusPage();
COutilModbus *mProgramHandle;
int SetConnected(bool Connected);
void UpdateZTInfo(CZTInfo *DataStruct);
private:
Ui::CSEIModbusPage *ui;
public slots:
void ServerStartStopPressed();
void EnableWatchdogChkBxClicked();
void AN1ChkBoxToggled();
void AN2ChkBoxToggled();
};
#endif // SEIMODBUSPAGE_H

128
Sources/SEIModbusPage.ui Normal file
View File

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CSEIModbusPage</class>
<widget class="QWidget" name="CSEIModbusPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>917</width>
<height>762</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<widget class="QLabel" name="mSEISimTitleLabel">
<property name="geometry">
<rect>
<x>250</x>
<y>30</y>
<width>361</width>
<height>31</height>
</rect>
</property>
<property name="text">
<string>Simulateur SEI</string>
</property>
<property name="textFormat">
<enum>Qt::AutoText</enum>
</property>
</widget>
<widget class="QLabel" name="mSEIConnectStatLabel">
<property name="geometry">
<rect>
<x>650</x>
<y>100</y>
<width>271</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>ZT:NON CONNECTÉE</string>
</property>
</widget>
<widget class="QPushButton" name="mStartStopServerBtn">
<property name="geometry">
<rect>
<x>750</x>
<y>30</y>
<width>101</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Démarrer Serveur</string>
</property>
</widget>
<widget class="QLabel" name="mServerLabel">
<property name="geometry">
<rect>
<x>780</x>
<y>10</y>
<width>46</width>
<height>13</height>
</rect>
</property>
<property name="text">
<string>Serveur</string>
</property>
</widget>
<widget class="QTreeWidget" name="mZTAlarmDataTree">
<property name="geometry">
<rect>
<x>30</x>
<y>110</y>
<width>541</width>
<height>641</height>
</rect>
</property>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
</widget>
<widget class="QCheckBox" name="mEnableWDChkBx">
<property name="geometry">
<rect>
<x>660</x>
<y>180</y>
<width>70</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>Watchdog</string>
</property>
</widget>
<widget class="QCheckBox" name="mAN1ChkBx">
<property name="geometry">
<rect>
<x>660</x>
<y>210</y>
<width>70</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>AN1</string>
</property>
</widget>
<widget class="QCheckBox" name="mAN2ChkBx">
<property name="geometry">
<rect>
<x>660</x>
<y>240</y>
<width>70</width>
<height>17</height>
</rect>
</property>
<property name="text">
<string>AN2</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,240 @@
/****************************************************************************
** Copyright (c) 2000-2003 Wayne Roth
** Copyright (c) 2004-2007 Stefan Sander
** Copyright (c) 2007 Michal Policht
** Copyright (c) 2008 Brandon Fosdick
** Copyright (c) 2009-2010 Liam Staskawicz
** Copyright (c) 2011 Debao Zhang
** All right reserved.
** Web: http://code.google.com/p/qextserialport/
**
** 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.
**
****************************************************************************/
#ifndef _QEXTSERIALPORT_H_
#define _QEXTSERIALPORT_H_
#include <QtCore/QIODevice>
#include "qextserialport_global.h"
#ifdef Q_OS_UNIX
#include <termios.h>
#endif
/*line status constants*/
// ### QESP2.0 move to enum
#define LS_CTS 0x01
#define LS_DSR 0x02
#define LS_DCD 0x04
#define LS_RI 0x08
#define LS_RTS 0x10
#define LS_DTR 0x20
#define LS_ST 0x40
#define LS_SR 0x80
/*error constants*/
// ### QESP2.0 move to enum
#define E_NO_ERROR 0
#define E_INVALID_FD 1
#define E_NO_MEMORY 2
#define E_CAUGHT_NON_BLOCKED_SIGNAL 3
#define E_PORT_TIMEOUT 4
#define E_INVALID_DEVICE 5
#define E_BREAK_CONDITION 6
#define E_FRAMING_ERROR 7
#define E_IO_ERROR 8
#define E_BUFFER_OVERRUN 9
#define E_RECEIVE_OVERFLOW 10
#define E_RECEIVE_PARITY_ERROR 11
#define E_TRANSMIT_OVERFLOW 12
#define E_READ_FAILED 13
#define E_WRITE_FAILED 14
#define E_FILE_NOT_FOUND 15
#define E_PERMISSION_DENIED 16
#define E_AGAIN 17
enum BaudRateType
{
#if defined(Q_OS_UNIX) || defined(qdoc)
BAUD50 = 50, //POSIX ONLY
BAUD75 = 75, //POSIX ONLY
BAUD134 = 134, //POSIX ONLY
BAUD150 = 150, //POSIX ONLY
BAUD200 = 200, //POSIX ONLY
BAUD1800 = 1800, //POSIX ONLY
# if defined(B76800) || defined(qdoc)
BAUD76800 = 76800, //POSIX ONLY
# endif
# if (defined(B230400) && defined(B4000000)) || defined(qdoc)
BAUD230400 = 230400, //POSIX ONLY
BAUD460800 = 460800, //POSIX ONLY
BAUD500000 = 500000, //POSIX ONLY
BAUD576000 = 576000, //POSIX ONLY
BAUD921600 = 921600, //POSIX ONLY
BAUD1000000 = 1000000, //POSIX ONLY
BAUD1152000 = 1152000, //POSIX ONLY
BAUD1500000 = 1500000, //POSIX ONLY
BAUD2000000 = 2000000, //POSIX ONLY
BAUD2500000 = 2500000, //POSIX ONLY
BAUD3000000 = 3000000, //POSIX ONLY
BAUD3500000 = 3500000, //POSIX ONLY
BAUD4000000 = 4000000, //POSIX ONLY
# endif
#endif //Q_OS_UNIX
#if defined(Q_OS_WIN) || defined(qdoc)
BAUD14400 = 14400, //WINDOWS ONLY
BAUD56000 = 56000, //WINDOWS ONLY
BAUD128000 = 128000, //WINDOWS ONLY
BAUD256000 = 256000, //WINDOWS ONLY
#endif //Q_OS_WIN
BAUD110 = 110,
BAUD300 = 300,
BAUD600 = 600,
BAUD1200 = 1200,
BAUD2400 = 2400,
BAUD4800 = 4800,
BAUD9600 = 9600,
BAUD19200 = 19200,
BAUD38400 = 38400,
BAUD57600 = 57600,
BAUD115200 = 115200
};
enum DataBitsType
{
DATA_5 = 5,
DATA_6 = 6,
DATA_7 = 7,
DATA_8 = 8
};
enum ParityType
{
PAR_NONE,
PAR_ODD,
PAR_EVEN,
#if defined(Q_OS_WIN) || defined(qdoc)
PAR_MARK, //WINDOWS ONLY
#endif
PAR_SPACE
};
enum StopBitsType
{
STOP_1,
#if defined(Q_OS_WIN) || defined(qdoc)
STOP_1_5, //WINDOWS ONLY
#endif
STOP_2
};
enum FlowType
{
FLOW_OFF,
FLOW_HARDWARE,
FLOW_XONXOFF
};
/**
* structure to contain port settings
*/
struct PortSettings
{
BaudRateType BaudRate;
DataBitsType DataBits;
ParityType Parity;
StopBitsType StopBits;
FlowType FlowControl;
long Timeout_Millisec;
};
class QextSerialPortPrivate;
class QEXTSERIALPORT_EXPORT QextSerialPort: public QIODevice
{
Q_OBJECT
Q_DECLARE_PRIVATE(QextSerialPort)
Q_ENUMS(QueryMode)
Q_PROPERTY(QString portName READ portName WRITE setPortName)
Q_PROPERTY(QueryMode queryMode READ queryMode WRITE setQueryMode)
public:
enum QueryMode {
Polling,
EventDriven
};
explicit QextSerialPort(QueryMode mode = EventDriven, QObject *parent = 0);
explicit QextSerialPort(const QString &name, QueryMode mode = EventDriven, QObject *parent = 0);
explicit QextSerialPort(const PortSettings &s, QueryMode mode = EventDriven, QObject *parent = 0);
QextSerialPort(const QString &name, const PortSettings &s, QueryMode mode = EventDriven, QObject *parent=0);
~QextSerialPort();
QString portName() const;
QueryMode queryMode() const;
BaudRateType baudRate() const;
DataBitsType dataBits() const;
ParityType parity() const;
StopBitsType stopBits() const;
FlowType flowControl() const;
bool open(OpenMode mode);
bool isSequential() const;
void close();
void flush();
qint64 bytesAvailable() const;
bool canReadLine() const;
QByteArray readAll();
ulong lastError() const;
ulong lineStatus();
QString errorString();
public Q_SLOTS:
void setPortName(const QString &name);
void setQueryMode(QueryMode mode);
void setBaudRate(BaudRateType);
void setDataBits(DataBitsType);
void setParity(ParityType);
void setStopBits(StopBitsType);
void setFlowControl(FlowType);
void setTimeout(long);
void setDtr(bool set=true);
void setRts(bool set=true);
Q_SIGNALS:
void dsrChanged(bool status);
protected:
qint64 readData(char *data, qint64 maxSize);
qint64 writeData(const char *data, qint64 maxSize);
private:
Q_DISABLE_COPY(QextSerialPort)
#ifdef Q_OS_WIN
Q_PRIVATE_SLOT(d_func(), void _q_onWinEvent(HANDLE))
#endif
Q_PRIVATE_SLOT(d_func(), void _q_canRead())
QextSerialPortPrivate *const d_ptr;
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,240 @@
/****************************************************************************
** Copyright (c) 2000-2003 Wayne Roth
** Copyright (c) 2004-2007 Stefan Sander
** Copyright (c) 2007 Michal Policht
** Copyright (c) 2008 Brandon Fosdick
** Copyright (c) 2009-2010 Liam Staskawicz
** Copyright (c) 2011 Debao Zhang
** All right reserved.
** Web: http://code.google.com/p/qextserialport/
**
** 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.
**
****************************************************************************/
#ifndef _QEXTSERIALPORT_H_
#define _QEXTSERIALPORT_H_
#include <QtCore/QIODevice>
#include "qextserialport_global.h"
#ifdef Q_OS_UNIX
#include <termios.h>
#endif
/*line status constants*/
// ### QESP2.0 move to enum
#define LS_CTS 0x01
#define LS_DSR 0x02
#define LS_DCD 0x04
#define LS_RI 0x08
#define LS_RTS 0x10
#define LS_DTR 0x20
#define LS_ST 0x40
#define LS_SR 0x80
/*error constants*/
// ### QESP2.0 move to enum
#define E_NO_ERROR 0
#define E_INVALID_FD 1
#define E_NO_MEMORY 2
#define E_CAUGHT_NON_BLOCKED_SIGNAL 3
#define E_PORT_TIMEOUT 4
#define E_INVALID_DEVICE 5
#define E_BREAK_CONDITION 6
#define E_FRAMING_ERROR 7
#define E_IO_ERROR 8
#define E_BUFFER_OVERRUN 9
#define E_RECEIVE_OVERFLOW 10
#define E_RECEIVE_PARITY_ERROR 11
#define E_TRANSMIT_OVERFLOW 12
#define E_READ_FAILED 13
#define E_WRITE_FAILED 14
#define E_FILE_NOT_FOUND 15
#define E_PERMISSION_DENIED 16
#define E_AGAIN 17
enum BaudRateType
{
#if defined(Q_OS_UNIX) || defined(qdoc)
BAUD50 = 50, //POSIX ONLY
BAUD75 = 75, //POSIX ONLY
BAUD134 = 134, //POSIX ONLY
BAUD150 = 150, //POSIX ONLY
BAUD200 = 200, //POSIX ONLY
BAUD1800 = 1800, //POSIX ONLY
# if defined(B76800) || defined(qdoc)
BAUD76800 = 76800, //POSIX ONLY
# endif
# if (defined(B230400) && defined(B4000000)) || defined(qdoc)
BAUD230400 = 230400, //POSIX ONLY
BAUD460800 = 460800, //POSIX ONLY
BAUD500000 = 500000, //POSIX ONLY
BAUD576000 = 576000, //POSIX ONLY
BAUD921600 = 921600, //POSIX ONLY
BAUD1000000 = 1000000, //POSIX ONLY
BAUD1152000 = 1152000, //POSIX ONLY
BAUD1500000 = 1500000, //POSIX ONLY
BAUD2000000 = 2000000, //POSIX ONLY
BAUD2500000 = 2500000, //POSIX ONLY
BAUD3000000 = 3000000, //POSIX ONLY
BAUD3500000 = 3500000, //POSIX ONLY
BAUD4000000 = 4000000, //POSIX ONLY
# endif
#endif //Q_OS_UNIX
#if defined(Q_OS_WIN) || defined(qdoc)
BAUD14400 = 14400, //WINDOWS ONLY
BAUD56000 = 56000, //WINDOWS ONLY
BAUD128000 = 128000, //WINDOWS ONLY
BAUD256000 = 256000, //WINDOWS ONLY
#endif //Q_OS_WIN
BAUD110 = 110,
BAUD300 = 300,
BAUD600 = 600,
BAUD1200 = 1200,
BAUD2400 = 2400,
BAUD4800 = 4800,
BAUD9600 = 9600,
BAUD19200 = 19200,
BAUD38400 = 38400,
BAUD57600 = 57600,
BAUD115200 = 115200
};
enum DataBitsType
{
DATA_5 = 5,
DATA_6 = 6,
DATA_7 = 7,
DATA_8 = 8
};
enum ParityType
{
PAR_NONE,
PAR_ODD,
PAR_EVEN,
#if defined(Q_OS_WIN) || defined(qdoc)
PAR_MARK, //WINDOWS ONLY
#endif
PAR_SPACE
};
enum StopBitsType
{
STOP_1,
#if defined(Q_OS_WIN) || defined(qdoc)
STOP_1_5, //WINDOWS ONLY
#endif
STOP_2
};
enum FlowType
{
FLOW_OFF,
FLOW_HARDWARE,
FLOW_XONXOFF
};
/**
* structure to contain port settings
*/
struct PortSettings
{
BaudRateType BaudRate;
DataBitsType DataBits;
ParityType Parity;
StopBitsType StopBits;
FlowType FlowControl;
long Timeout_Millisec;
};
class QextSerialPortPrivate;
class QEXTSERIALPORT_EXPORT QextSerialPort: public QIODevice
{
Q_OBJECT
Q_DECLARE_PRIVATE(QextSerialPort)
Q_ENUMS(QueryMode)
Q_PROPERTY(QString portName READ portName WRITE setPortName)
Q_PROPERTY(QueryMode queryMode READ queryMode WRITE setQueryMode)
public:
enum QueryMode {
Polling,
EventDriven
};
explicit QextSerialPort(QueryMode mode = EventDriven, QObject *parent = 0);
explicit QextSerialPort(const QString &name, QueryMode mode = EventDriven, QObject *parent = 0);
explicit QextSerialPort(const PortSettings &s, QueryMode mode = EventDriven, QObject *parent = 0);
QextSerialPort(const QString &name, const PortSettings &s, QueryMode mode = EventDriven, QObject *parent=0);
~QextSerialPort();
QString portName() const;
QueryMode queryMode() const;
BaudRateType baudRate() const;
DataBitsType dataBits() const;
ParityType parity() const;
StopBitsType stopBits() const;
FlowType flowControl() const;
bool open(OpenMode mode);
bool isSequential() const;
void close();
void flush();
qint64 bytesAvailable() const;
bool canReadLine() const;
QByteArray readAll();
ulong lastError() const;
ulong lineStatus();
QString errorString();
public Q_SLOTS:
void setPortName(const QString &name);
void setQueryMode(QueryMode mode);
void setBaudRate(BaudRateType);
void setDataBits(DataBitsType);
void setParity(ParityType);
void setStopBits(StopBitsType);
void setFlowControl(FlowType);
void setTimeout(long);
void setDtr(bool set=true);
void setRts(bool set=true);
Q_SIGNALS:
void dsrChanged(bool status);
protected:
qint64 readData(char *data, qint64 maxSize);
qint64 writeData(const char *data, qint64 maxSize);
private:
Q_DISABLE_COPY(QextSerialPort)
#ifdef Q_OS_WIN
Q_PRIVATE_SLOT(d_func(), void _q_onWinEvent(HANDLE))
#endif
Q_PRIVATE_SLOT(d_func(), void _q_canRead())
QextSerialPortPrivate *const d_ptr;
};
#endif

View File

@ -0,0 +1,36 @@
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
PUBLIC_HEADERS += $$PWD/qextserialport.h \
$$PWD/qextserialenumerator.h \
$$PWD/qextserialport_global.h
HEADERS += $$PUBLIC_HEADERS \
$$PWD/qextserialport_p.h \
$$PWD/qextserialenumerator_p.h \
SOURCES += $$PWD/qextserialport.cpp \
$$PWD/qextserialenumerator.cpp
unix {
SOURCES += $$PWD/qextserialport_unix.cpp
linux* {
SOURCES += $$PWD/qextserialenumerator_linux.cpp
} else:macx {
SOURCES += $$PWD/qextserialenumerator_osx.cpp
} else {
SOURCES += $$PWD/qextserialenumerator_unix.cpp
}
}
win32:SOURCES += $$PWD/qextserialport_win.cpp \
$$PWD/qextserialenumerator_win.cpp
linux*{
!qesp_linux_udev:DEFINES += QESP_NO_UDEV
qesp_linux_udev: LIBS += -ludev
}
macx:LIBS += -framework IOKit -framework CoreFoundation
win32:LIBS += -lsetupapi -ladvapi32 -luser32
# moc doesn't detect Q_OS_LINUX correctly, so add this to make it work
linux*:DEFINES += __linux__

View File

@ -0,0 +1,72 @@
/****************************************************************************
** Copyright (c) 2000-2003 Wayne Roth
** Copyright (c) 2004-2007 Stefan Sander
** Copyright (c) 2007 Michal Policht
** Copyright (c) 2008 Brandon Fosdick
** Copyright (c) 2009-2010 Liam Staskawicz
** Copyright (c) 2011 Debao Zhang
** All right reserved.
** Web: http://code.google.com/p/qextserialport/
**
** 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.
**
****************************************************************************/
#ifndef QEXTSERIALPORT_GLOBAL_H
#define QEXTSERIALPORT_GLOBAL_H
#include <QtCore/QtGlobal>
#ifdef QEXTSERIALPORT_BUILD_SHARED
# define QEXTSERIALPORT_EXPORT Q_DECL_EXPORT
#elif defined(QEXTSERIALPORT_USING_SHARED)
# define QEXTSERIALPORT_EXPORT Q_DECL_IMPORT
#else
# define QEXTSERIALPORT_EXPORT
#endif
// ### for compatible with old version. should be removed in QESP 2.0
#ifdef _TTY_NOWARN_
# define QESP_NO_WARN
#endif
#ifdef _TTY_NOWARN_PORT_
# define QESP_NO_PORTABILITY_WARN
#endif
/*if all warning messages are turned off, flag portability warnings to be turned off as well*/
#ifdef QESP_NO_WARN
# define QESP_NO_PORTABILITY_WARN
#endif
/*macros for warning and debug messages*/
#ifdef QESP_NO_PORTABILITY_WARN
# define QESP_PORTABILITY_WARNING while (false)qWarning
#else
# define QESP_PORTABILITY_WARNING qWarning
#endif /*QESP_NOWARN_PORT*/
#ifdef QESP_NO_WARN
# define QESP_WARNING while (false)qWarning
#else
# define QESP_WARNING qWarning
#endif /*QESP_NOWARN*/
#endif // QEXTSERIALPORT_GLOBAL_H

View File

@ -0,0 +1,251 @@
/****************************************************************************
** Copyright (c) 2000-2003 Wayne Roth
** Copyright (c) 2004-2007 Stefan Sander
** Copyright (c) 2007 Michal Policht
** Copyright (c) 2008 Brandon Fosdick
** Copyright (c) 2009-2010 Liam Staskawicz
** Copyright (c) 2011 Debao Zhang
** All right reserved.
** Web: http://code.google.com/p/qextserialport/
**
** 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.
**
****************************************************************************/
#ifndef _QEXTSERIALPORT_P_H_
#define _QEXTSERIALPORT_P_H_
//
// W A R N I N G
// -------------
//
// This file is not part of the QESP API. It exists for the convenience
// of other QESP classes. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qextserialport.h"
#include <QtCore/QReadWriteLock>
#ifdef Q_OS_UNIX
# include <termios.h>
#elif (defined Q_OS_WIN)
# include <QtCore/qt_windows.h>
#endif
#include <stdlib.h>
// This is QextSerialPort's read buffer, needed by posix system.
// ref: QRingBuffer & QIODevicePrivateLinearBuffer
class QextReadBuffer
{
public:
inline QextReadBuffer(size_t growth=4096)
: len(0), first(0), buf(0), capacity(0), basicBlockSize(growth) {
}
~QextReadBuffer() {
delete [] buf;
}
inline void clear() {
first = buf;
len = 0;
}
inline int size() const {
return len;
}
inline bool isEmpty() const {
return len == 0;
}
inline int read(char *target, int size) {
int r = qMin(size, len);
if (r == 1) {
*target = *first;
--len;
++first;
} else {
memcpy(target, first, r);
len -= r;
first += r;
}
return r;
}
inline char *reserve(size_t size) {
if ((first - buf) + len + size > capacity) {
size_t newCapacity = qMax(capacity, basicBlockSize);
while (newCapacity < len + size)
newCapacity *= 2;
if (newCapacity > capacity) {
// allocate more space
char *newBuf = new char[newCapacity];
memmove(newBuf, first, len);
delete [] buf;
buf = newBuf;
capacity = newCapacity;
} else {
// shift any existing data to make space
memmove(buf, first, len);
}
first = buf;
}
char *writePtr = first + len;
len += (int)size;
return writePtr;
}
inline void chop(int size) {
if (size >= len) {
clear();
} else {
len -= size;
}
}
inline void squeeze() {
if (first != buf) {
memmove(buf, first, len);
first = buf;
}
size_t newCapacity = basicBlockSize;
while (newCapacity < size_t(len))
newCapacity *= 2;
if (newCapacity < capacity) {
char *tmp = static_cast<char *>(realloc(buf, newCapacity));
if (tmp) {
buf = tmp;
capacity = newCapacity;
}
}
}
inline QByteArray readAll() {
char *f = first;
int l = len;
clear();
return QByteArray(f, l);
}
inline int readLine(char *target, int size) {
int r = qMin(size, len);
char *eol = static_cast<char *>(memchr(first, '\n', r));
if (eol)
r = 1+(eol-first);
memcpy(target, first, r);
len -= r;
first += r;
return int(r);
}
inline bool canReadLine() const {
return memchr(first, '\n', len);
}
private:
int len;
char *first;
char *buf;
size_t capacity;
size_t basicBlockSize;
};
class QWinEventNotifier;
class QReadWriteLock;
class QSocketNotifier;
class QextSerialPortPrivate
{
Q_DECLARE_PUBLIC(QextSerialPort)
public:
QextSerialPortPrivate(QextSerialPort *q);
~QextSerialPortPrivate();
enum DirtyFlagEnum
{
DFE_BaudRate = 0x0001,
DFE_Parity = 0x0002,
DFE_StopBits = 0x0004,
DFE_DataBits = 0x0008,
DFE_Flow = 0x0010,
DFE_TimeOut = 0x0100,
DFE_ALL = 0x0fff,
DFE_Settings_Mask = 0x00ff //without TimeOut
};
mutable QReadWriteLock lock;
QString port;
PortSettings settings;
QextReadBuffer readBuffer;
int settingsDirtyFlags;
ulong lastErr;
QextSerialPort::QueryMode queryMode;
// platform specific members
#ifdef Q_OS_UNIX
int fd;
QSocketNotifier *readNotifier;
struct termios currentTermios;
struct termios oldTermios;
#elif (defined Q_OS_WIN)
HANDLE handle;
OVERLAPPED overlap;
COMMCONFIG commConfig;
COMMTIMEOUTS commTimeouts;
QWinEventNotifier *winEventNotifier;
DWORD eventMask;
QList<OVERLAPPED *> pendingWrites;
QReadWriteLock *bytesToWriteLock;
#endif
/*fill PortSettings*/
void setBaudRate(BaudRateType baudRate, bool update=true);
void setDataBits(DataBitsType dataBits, bool update=true);
void setParity(ParityType parity, bool update=true);
void setStopBits(StopBitsType stopbits, bool update=true);
void setFlowControl(FlowType flow, bool update=true);
void setTimeout(long millisec, bool update=true);
void setPortSettings(const PortSettings &settings, bool update=true);
void platformSpecificDestruct();
void platformSpecificInit();
void translateError(ulong error);
void updatePortSettings();
qint64 readData_sys(char *data, qint64 maxSize);
qint64 writeData_sys(const char *data, qint64 maxSize);
void setDtr_sys(bool set=true);
void setRts_sys(bool set=true);
bool open_sys(QIODevice::OpenMode mode);
bool close_sys();
bool flush_sys();
ulong lineStatus_sys();
qint64 bytesAvailable_sys() const;
#ifdef Q_OS_WIN
void _q_onWinEvent(HANDLE h);
#endif
void _q_canRead();
QextSerialPort *q_ptr;
};
#endif //_QEXTSERIALPORT_P_H_

View File

@ -0,0 +1,418 @@
/****************************************************************************
** Copyright (c) 2000-2003 Wayne Roth
** Copyright (c) 2004-2007 Stefan Sander
** Copyright (c) 2007 Michal Policht
** Copyright (c) 2008 Brandon Fosdick
** Copyright (c) 2009-2010 Liam Staskawicz
** Copyright (c) 2011 Debao Zhang
** All right reserved.
** Web: http://code.google.com/p/qextserialport/
**
** 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.
**
****************************************************************************/
#include "qextserialport.h"
#include "qextserialport_p.h"
#include <QtCore/QThread>
#include <QtCore/QReadWriteLock>
#include <QtCore/QMutexLocker>
#include <QtCore/QDebug>
#include <QtCore/QRegExp>
#include <QtCore/QMetaType>
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
# include <QtCore/QWinEventNotifier>
#else
# include <QtCore/private/qwineventnotifier_p.h>
#endif
void QextSerialPortPrivate::platformSpecificInit()
{
handle = INVALID_HANDLE_VALUE;
ZeroMemory(&overlap, sizeof(OVERLAPPED));
overlap.hEvent = CreateEvent(NULL, true, false, NULL);
winEventNotifier = 0;
bytesToWriteLock = new QReadWriteLock;
}
void QextSerialPortPrivate::platformSpecificDestruct() {
CloseHandle(overlap.hEvent);
delete bytesToWriteLock;
}
/*!
\internal
COM ports greater than 9 need \\.\ prepended
This is only need when open the port.
*/
static QString fullPortNameWin(const QString &name)
{
QRegExp rx(QLatin1String("^COM(\\d+)"));
QString fullName(name);
if (fullName.contains(rx))
fullName.prepend(QLatin1String("\\\\.\\"));
return fullName;
}
bool QextSerialPortPrivate::open_sys(QIODevice::OpenMode mode)
{
Q_Q(QextSerialPort);
DWORD confSize = sizeof(COMMCONFIG);
commConfig.dwSize = confSize;
DWORD dwFlagsAndAttributes = 0;
if (queryMode == QextSerialPort::EventDriven)
dwFlagsAndAttributes += FILE_FLAG_OVERLAPPED;
/*open the port*/
handle = CreateFileW((wchar_t *)fullPortNameWin(port).utf16(), GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);
if (handle != INVALID_HANDLE_VALUE) {
q->setOpenMode(mode);
/*configure port settings*/
GetCommConfig(handle, &commConfig, &confSize);
GetCommState(handle, &(commConfig.dcb));
/*set up parameters*/
commConfig.dcb.fBinary = TRUE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
commConfig.dcb.fAbortOnError = FALSE;
commConfig.dcb.fNull = FALSE;
/* Dtr default to true. See Issue 122*/
commConfig.dcb.fDtrControl = TRUE;
/*flush all settings*/
settingsDirtyFlags = DFE_ALL;
updatePortSettings();
//init event driven approach
if (queryMode == QextSerialPort::EventDriven) {
if (!SetCommMask(handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) {
QESP_WARNING()<<"failed to set Comm Mask. Error code:"<<GetLastError();
return false;
}
winEventNotifier = new QWinEventNotifier(overlap.hEvent, q);
qRegisterMetaType<HANDLE>("HANDLE");
q->connect(winEventNotifier, SIGNAL(activated(HANDLE)), q, SLOT(_q_onWinEvent(HANDLE)), Qt::DirectConnection);
WaitCommEvent(handle, &eventMask, &overlap);
}
return true;
}
return false;
}
bool QextSerialPortPrivate::close_sys()
{
flush_sys();
CancelIo(handle);
if (CloseHandle(handle))
handle = INVALID_HANDLE_VALUE;
if (winEventNotifier) {
winEventNotifier->setEnabled(false);
winEventNotifier->deleteLater();
winEventNotifier = 0;
}
foreach (OVERLAPPED *o, pendingWrites) {
CloseHandle(o->hEvent);
delete o;
}
pendingWrites.clear();
return true;
}
bool QextSerialPortPrivate::flush_sys()
{
FlushFileBuffers(handle);
return true;
}
qint64 QextSerialPortPrivate::bytesAvailable_sys() const
{
DWORD Errors;
COMSTAT Status;
if (ClearCommError(handle, &Errors, &Status)) {
return Status.cbInQue;
}
return (qint64)-1;
}
/*
Translates a system-specific error code to a QextSerialPort error code. Used internally.
*/
void QextSerialPortPrivate::translateError(ulong error)
{
if (error & CE_BREAK) {
lastErr = E_BREAK_CONDITION;
}
else if (error & CE_FRAME) {
lastErr = E_FRAMING_ERROR;
}
else if (error & CE_IOE) {
lastErr = E_IO_ERROR;
}
else if (error & CE_MODE) {
lastErr = E_INVALID_FD;
}
else if (error & CE_OVERRUN) {
lastErr = E_BUFFER_OVERRUN;
}
else if (error & CE_RXPARITY) {
lastErr = E_RECEIVE_PARITY_ERROR;
}
else if (error & CE_RXOVER) {
lastErr = E_RECEIVE_OVERFLOW;
}
else if (error & CE_TXFULL) {
lastErr = E_TRANSMIT_OVERFLOW;
}
}
/*
Reads a block of data from the serial port. This function will read at most maxlen bytes from
the serial port and place them in the buffer pointed to by data. Return value is the number of
bytes actually read, or -1 on error.
\warning before calling this function ensure that serial port associated with this class
is currently open (use isOpen() function to check if port is open).
*/
qint64 QextSerialPortPrivate::readData_sys(char *data, qint64 maxSize)
{
DWORD bytesRead = 0;
bool failed = false;
if (queryMode == QextSerialPort::EventDriven) {
OVERLAPPED overlapRead;
ZeroMemory(&overlapRead, sizeof(OVERLAPPED));
if (!ReadFile(handle, (void *)data, (DWORD)maxSize, &bytesRead, &overlapRead)) {
if (GetLastError() == ERROR_IO_PENDING)
GetOverlappedResult(handle, &overlapRead, &bytesRead, true);
else
failed = true;
}
} else if (!ReadFile(handle, (void *)data, (DWORD)maxSize, &bytesRead, NULL)) {
failed = true;
}
if (!failed)
return (qint64)bytesRead;
lastErr = E_READ_FAILED;
return -1;
}
/*
Writes a block of data to the serial port. This function will write len bytes
from the buffer pointed to by data to the serial port. Return value is the number
of bytes actually written, or -1 on error.
\warning before calling this function ensure that serial port associated with this class
is currently open (use isOpen() function to check if port is open).
*/
qint64 QextSerialPortPrivate::writeData_sys(const char *data, qint64 maxSize)
{
DWORD bytesWritten = 0;
bool failed = false;
if (queryMode == QextSerialPort::EventDriven) {
OVERLAPPED *newOverlapWrite = new OVERLAPPED;
ZeroMemory(newOverlapWrite, sizeof(OVERLAPPED));
newOverlapWrite->hEvent = CreateEvent(NULL, true, false, NULL);
if (WriteFile(handle, (void *)data, (DWORD)maxSize, &bytesWritten, newOverlapWrite)) {
CloseHandle(newOverlapWrite->hEvent);
delete newOverlapWrite;
}
else if (GetLastError() == ERROR_IO_PENDING) {
// writing asynchronously...not an error
QWriteLocker writelocker(bytesToWriteLock);
pendingWrites.append(newOverlapWrite);
}
else {
QESP_WARNING()<<"QextSerialPort write error:"<<GetLastError();
failed = true;
if (!CancelIo(newOverlapWrite->hEvent))
QESP_WARNING("QextSerialPort: couldn't cancel IO");
if (!CloseHandle(newOverlapWrite->hEvent))
QESP_WARNING("QextSerialPort: couldn't close OVERLAPPED handle");
delete newOverlapWrite;
}
} else if (!WriteFile(handle, (void *)data, (DWORD)maxSize, &bytesWritten, NULL)) {
failed = true;
}
if (!failed)
return (qint64)bytesWritten;
lastErr = E_WRITE_FAILED;
return -1;
}
void QextSerialPortPrivate::setDtr_sys(bool set) {
EscapeCommFunction(handle, set ? SETDTR : CLRDTR);
}
void QextSerialPortPrivate::setRts_sys(bool set) {
EscapeCommFunction(handle, set ? SETRTS : CLRRTS);
}
ulong QextSerialPortPrivate::lineStatus_sys(void) {
unsigned long Status = 0, Temp = 0;
GetCommModemStatus(handle, &Temp);
if (Temp & MS_CTS_ON) Status |= LS_CTS;
if (Temp & MS_DSR_ON) Status |= LS_DSR;
if (Temp & MS_RING_ON) Status |= LS_RI;
if (Temp & MS_RLSD_ON) Status |= LS_DCD;
return Status;
}
/*
Triggered when there's activity on our HANDLE.
*/
void QextSerialPortPrivate::_q_onWinEvent(HANDLE h)
{
Q_Q(QextSerialPort);
if (h == overlap.hEvent) {
if (eventMask & EV_RXCHAR) {
if (q->sender() != q && bytesAvailable_sys() > 0)
_q_canRead();
}
if (eventMask & EV_TXEMPTY) {
/*
A write completed. Run through the list of OVERLAPPED writes, and if
they completed successfully, take them off the list and delete them.
Otherwise, leave them on there so they can finish.
*/
qint64 totalBytesWritten = 0;
QList<OVERLAPPED *> overlapsToDelete;
foreach (OVERLAPPED *o, pendingWrites) {
DWORD numBytes = 0;
if (GetOverlappedResult(handle, o, &numBytes, false)) {
overlapsToDelete.append(o);
totalBytesWritten += numBytes;
} else if (GetLastError() != ERROR_IO_INCOMPLETE) {
overlapsToDelete.append(o);
QESP_WARNING()<<"CommEvent overlapped write error:" << GetLastError();
}
}
if (q->sender() != q && totalBytesWritten > 0) {
QWriteLocker writelocker(bytesToWriteLock);
Q_EMIT q->bytesWritten(totalBytesWritten);
}
foreach (OVERLAPPED *o, overlapsToDelete) {
OVERLAPPED *toDelete = pendingWrites.takeAt(pendingWrites.indexOf(o));
CloseHandle(toDelete->hEvent);
delete toDelete;
}
}
if (eventMask & EV_DSR) {
if (lineStatus_sys() & LS_DSR)
Q_EMIT q->dsrChanged(true);
else
Q_EMIT q->dsrChanged(false);
}
}
WaitCommEvent(handle, &eventMask, &overlap);
}
void QextSerialPortPrivate::updatePortSettings()
{
if (!q_ptr->isOpen() || !settingsDirtyFlags)
return;
//fill struct : COMMCONFIG
if (settingsDirtyFlags & DFE_BaudRate) {
commConfig.dcb.BaudRate = settings.BaudRate;
}
if (settingsDirtyFlags & DFE_Parity) {
commConfig.dcb.Parity = (BYTE)settings.Parity;
commConfig.dcb.fParity = (settings.Parity == PAR_NONE) ? FALSE : TRUE;
}
if (settingsDirtyFlags & DFE_DataBits) {
commConfig.dcb.ByteSize = (BYTE)settings.DataBits;
}
if (settingsDirtyFlags & DFE_StopBits) {
switch (settings.StopBits) {
case STOP_1:
commConfig.dcb.StopBits = ONESTOPBIT;
break;
case STOP_1_5:
commConfig.dcb.StopBits = ONE5STOPBITS;
break;
case STOP_2:
commConfig.dcb.StopBits = TWOSTOPBITS;
break;
}
}
if (settingsDirtyFlags & DFE_Flow) {
switch(settings.FlowControl) {
/*no flow control*/
case FLOW_OFF:
commConfig.dcb.fOutxCtsFlow = FALSE;
commConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
break;
/*software (XON/XOFF) flow control*/
case FLOW_XONXOFF:
commConfig.dcb.fOutxCtsFlow = FALSE;
commConfig.dcb.fRtsControl = RTS_CONTROL_DISABLE;
commConfig.dcb.fInX = TRUE;
commConfig.dcb.fOutX = TRUE;
break;
/*hardware flow control*/
case FLOW_HARDWARE:
commConfig.dcb.fOutxCtsFlow = TRUE;
commConfig.dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
commConfig.dcb.fInX = FALSE;
commConfig.dcb.fOutX = FALSE;
break;
}
}
//fill struct : COMMTIMEOUTS
if (settingsDirtyFlags & DFE_TimeOut) {
if (queryMode != QextSerialPort::EventDriven) {
int millisec = settings.Timeout_Millisec;
if (millisec == -1) {
commTimeouts.ReadIntervalTimeout = MAXDWORD;
commTimeouts.ReadTotalTimeoutConstant = 0;
} else {
commTimeouts.ReadIntervalTimeout = millisec;
commTimeouts.ReadTotalTimeoutConstant = millisec;
}
commTimeouts.ReadTotalTimeoutMultiplier = 0;
commTimeouts.WriteTotalTimeoutMultiplier = millisec;
commTimeouts.WriteTotalTimeoutConstant = 0;
}
else {
commTimeouts.ReadIntervalTimeout = MAXDWORD;
commTimeouts.ReadTotalTimeoutMultiplier = 0;
commTimeouts.ReadTotalTimeoutConstant = 0;
commTimeouts.WriteTotalTimeoutMultiplier = 0;
commTimeouts.WriteTotalTimeoutConstant = 0;
}
}
if (settingsDirtyFlags & DFE_Settings_Mask)
SetCommConfig(handle, &commConfig, sizeof(COMMCONFIG));
if ((settingsDirtyFlags & DFE_TimeOut))
SetCommTimeouts(handle, &commTimeouts);
settingsDirtyFlags = 0;
}

View File

@ -0,0 +1,72 @@
/****************************************************************************
** Copyright (c) 2000-2003 Wayne Roth
** Copyright (c) 2004-2007 Stefan Sander
** Copyright (c) 2007 Michal Policht
** Copyright (c) 2008 Brandon Fosdick
** Copyright (c) 2009-2010 Liam Staskawicz
** Copyright (c) 2011 Debao Zhang
** All right reserved.
** Web: http://code.google.com/p/qextserialport/
**
** 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.
**
****************************************************************************/
#ifndef QEXTSERIALPORT_GLOBAL_H
#define QEXTSERIALPORT_GLOBAL_H
#include <QtCore/QtGlobal>
#ifdef QEXTSERIALPORT_BUILD_SHARED
# define QEXTSERIALPORT_EXPORT Q_DECL_EXPORT
#elif defined(QEXTSERIALPORT_USING_SHARED)
# define QEXTSERIALPORT_EXPORT Q_DECL_IMPORT
#else
# define QEXTSERIALPORT_EXPORT
#endif
// ### for compatible with old version. should be removed in QESP 2.0
#ifdef _TTY_NOWARN_
# define QESP_NO_WARN
#endif
#ifdef _TTY_NOWARN_PORT_
# define QESP_NO_PORTABILITY_WARN
#endif
/*if all warning messages are turned off, flag portability warnings to be turned off as well*/
#ifdef QESP_NO_WARN
# define QESP_NO_PORTABILITY_WARN
#endif
/*macros for warning and debug messages*/
#ifdef QESP_NO_PORTABILITY_WARN
# define QESP_PORTABILITY_WARNING while (false)qWarning
#else
# define QESP_PORTABILITY_WARNING qWarning
#endif /*QESP_NOWARN_PORT*/
#ifdef QESP_NO_WARN
# define QESP_WARNING while (false)qWarning
#else
# define QESP_WARNING qWarning
#endif /*QESP_NOWARN*/
#endif // QEXTSERIALPORT_GLOBAL_H

6
Sources/ZTInfo.cpp Normal file
View File

@ -0,0 +1,6 @@
#include "ZTInfo.h"
CZTInfo::CZTInfo()
{
}

74
Sources/ZTInfo.h Normal file
View File

@ -0,0 +1,74 @@
#ifndef ZTINFO_H
#define ZTINFO_H
#include <QList>
class CZTInfo
{
public:
int mZT1PPIAlarmFlag1;
int mZT1PPIAlarmFlag2;
int mZT1PPIAlarmFlag3;
int mZT1PPIAlarmFlag4;
int mZT1PPEAlarmFlag1;
int mZT1PPEAlarmFlag2;
int mZT1PPEAlarmFlag3;
int mZT1PPEAlarmFlag4;
int mZT1PGAlarmFlag1;
int mZT1PGAlarmFlag2;
int mZT1PGAlarmFlag3;
int mZT1PGAlarmFlag4;
int mZT1FNAlarmFlag1;
int mZT1FNAlarmFlag2;
int mZT1FNAlarmFlag3;
int mZT1FNAlarmFlag4;
QList<qint16> mZT1Ranks;
// int mZT1PPIRank1;
// int mZT1PPIRank2;
// int mZT1PPIRank3;
// int mZT1PPIRank4;
// int mZT1PPERank1;
// int mZT1PPERank2;
// int mZT1PPERank3;
// int mZT1PPERank4;
// int mZT1PGRank1;
// int mZT1PGRank2;
// int mZT1PGRank3;
// int mZT1PGRank4;
int mZT1V00AlarmFlag;
int mZT1PEQ1AlarmFlag;
int mZT2PPIAlarmFlag1;
int mZT2PPIAlarmFlag2;
int mZT2PPIAlarmFlag3;
int mZT2PPIAlarmFlag4;
int mZT2PPEAlarmFlag1;
int mZT2PPEAlarmFlag2;
int mZT2PPEAlarmFlag3;
int mZT2PPEAlarmFlag4;
QList<qint16> mZT2Ranks;
// int mZT2PPIRank1;
// int mZT2PPIRank2;
// int mZT2PPIRank3;
// int mZT2PPIRank4;
// int mZT2PPERank1;
// int mZT2PPERank2;
// int mZT2PPERank3;
// int mZT2PPERank4;
int mZT2V02AlarmFlag;
int mZT2PEQ2AlarmFlag;
int mITI10_12Flag;
int mWatchdogZT;
CZTInfo();
};
#endif // ZTINFO_H

15
Sources/main.cpp Normal file
View File

@ -0,0 +1,15 @@
//#include "MainWindow.h"
#include "OutilModbus.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
COutilModbus OutilModbus;
OutilModbus.Start();
return a.exec();
}

BIN
images/green-led-off-md.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
images/green-led-on-md.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

453
ui_CModbusPage.h Normal file
View File

@ -0,0 +1,453 @@
/********************************************************************************
** Form generated from reading UI file 'CModbusPage.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_CMODBUSPAGE_H
#define UI_CMODBUSPAGE_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QFrame>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSpinBox>
#include <QtWidgets/QTableWidget>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_CModbusPage
{
public:
QPushButton *mAN1Btn;
QPushButton *mAN2Btn;
QFrame *line;
QLabel *mSimCCTitleLabel;
QTextEdit *mCCEventsList;
QLineEdit *mZTIPAddressLineEdit;
QLineEdit *mZTPortLineEdit;
QPushButton *mConnectBtn;
QTableWidget *mModbusDatTable;
QLabel *mPPI1ZT1AlarmLabel;
QLabel *mPPEZT1AlarmLabel;
QLabel *mPGZT1AlarmLabel;
QLabel *mFNZT1AlarmLabel;
QLabel *mZT1AlarmeLabel;
QLabel *mZT1RangLabel;
QLabel *mZT1RangAlarmeLabel;
QLabel *mZT1RangFNLabel;
QLabel *mZT2AlarmeLabel;
QLabel *mPPIZT2AlarmLabel;
QLabel *mPPEZT2AlarmLabel;
QLabel *mZT2RangLabel;
QLabel *mZT2RangAlarmeLabel;
QLabel *mPEQ1AlarmLabel;
QLabel *mPEQ2AlarmLabel;
QLabel *mV00AlarmLabel;
QLabel *mV02AlarmLabel;
QFrame *line_2;
QFrame *line_3;
QLabel *mSimSEITitleLabel;
QLineEdit *mZTAutoReqDelay;
QLabel *mReqDelayLabel;
QPushButton *mSendModbusReadBtn;
QCheckBox *mAutoRequestChkBx;
QCheckBox *mStayOnTopChkBx;
QLabel *mPPI2ZT1AlarmLabel;
QLabel *mPPI3ZT1AlarmLabel;
QLabel *mPPIZT1AlarmLabel_4;
QLabel *mPPI2ZT1Rank;
QLabel *mPPI1ZT1Rank;
QLabel *mPPI3ZT1Rank;
QLabel *mPPIZT1AlarmLabel_5;
QLabel *mPPEZT1AlarmLabel_2;
QLabel *mPPEZT1AlarmLabel_3;
QLabel *mPPEZT1AlarmLabel_4;
QTableWidget *mCCModbusTable;
QTreeWidget *mCCModbusDataTree;
QPushButton *mZTC1Btn;
QPushButton *mAN1Btn_3;
QLabel *mActivityBitmap;
QCheckBox *mWatchdogChkBx;
QPushButton *mDateTimeBtn;
QSpinBox *mZT1Compo1;
QSpinBox *mZT1Compo2;
QSpinBox *mZT1Compo3;
QSpinBox *mZT2Compo1;
QSpinBox *mZT2Compo2;
QSpinBox *mZT2Compo3;
QPushButton *mSetTrainParamBtn;
QComboBox *mZT1TrainTypeBox;
QComboBox *mZT2TrainTypeBox;
QLabel *label;
QLabel *label_2;
QCheckBox *mZT1InhibPassChkBx;
QCheckBox *mZT2InhibPassChkBx;
QPushButton *pushButton;
void setupUi(QWidget *CModbusPage)
{
if (CModbusPage->objectName().isEmpty())
CModbusPage->setObjectName(QString::fromUtf8("CModbusPage"));
CModbusPage->resize(1024, 768);
mAN1Btn = new QPushButton(CModbusPage);
mAN1Btn->setObjectName(QString::fromUtf8("mAN1Btn"));
mAN1Btn->setGeometry(QRect(340, 90, 81, 23));
mAN2Btn = new QPushButton(CModbusPage);
mAN2Btn->setObjectName(QString::fromUtf8("mAN2Btn"));
mAN2Btn->setGeometry(QRect(450, 90, 81, 23));
line = new QFrame(CModbusPage);
line->setObjectName(QString::fromUtf8("line"));
line->setEnabled(false);
line->setGeometry(QRect(180, 290, 20, 221));
line->setFrameShape(QFrame::VLine);
line->setFrameShadow(QFrame::Sunken);
mSimCCTitleLabel = new QLabel(CModbusPage);
mSimCCTitleLabel->setObjectName(QString::fromUtf8("mSimCCTitleLabel"));
mSimCCTitleLabel->setGeometry(QRect(280, 20, 521, 31));
mSimCCTitleLabel->setAlignment(Qt::AlignCenter);
mCCEventsList = new QTextEdit(CModbusPage);
mCCEventsList->setObjectName(QString::fromUtf8("mCCEventsList"));
mCCEventsList->setEnabled(false);
mCCEventsList->setGeometry(QRect(530, 610, 511, 141));
mZTIPAddressLineEdit = new QLineEdit(CModbusPage);
mZTIPAddressLineEdit->setObjectName(QString::fromUtf8("mZTIPAddressLineEdit"));
mZTIPAddressLineEdit->setGeometry(QRect(40, 60, 231, 20));
mZTPortLineEdit = new QLineEdit(CModbusPage);
mZTPortLineEdit->setObjectName(QString::fromUtf8("mZTPortLineEdit"));
mZTPortLineEdit->setGeometry(QRect(280, 60, 61, 20));
mConnectBtn = new QPushButton(CModbusPage);
mConnectBtn->setObjectName(QString::fromUtf8("mConnectBtn"));
mConnectBtn->setGeometry(QRect(360, 60, 75, 23));
mModbusDatTable = new QTableWidget(CModbusPage);
mModbusDatTable->setObjectName(QString::fromUtf8("mModbusDatTable"));
mModbusDatTable->setEnabled(false);
mModbusDatTable->setGeometry(QRect(580, 410, 511, 181));
mPPI1ZT1AlarmLabel = new QLabel(CModbusPage);
mPPI1ZT1AlarmLabel->setObjectName(QString::fromUtf8("mPPI1ZT1AlarmLabel"));
mPPI1ZT1AlarmLabel->setEnabled(false);
mPPI1ZT1AlarmLabel->setGeometry(QRect(10, 290, 171, 16));
QFont font;
font.setPointSize(12);
mPPI1ZT1AlarmLabel->setFont(font);
mPPEZT1AlarmLabel = new QLabel(CModbusPage);
mPPEZT1AlarmLabel->setObjectName(QString::fromUtf8("mPPEZT1AlarmLabel"));
mPPEZT1AlarmLabel->setEnabled(false);
mPPEZT1AlarmLabel->setGeometry(QRect(20, 380, 161, 16));
mPPEZT1AlarmLabel->setFont(font);
mPGZT1AlarmLabel = new QLabel(CModbusPage);
mPGZT1AlarmLabel->setObjectName(QString::fromUtf8("mPGZT1AlarmLabel"));
mPGZT1AlarmLabel->setEnabled(false);
mPGZT1AlarmLabel->setGeometry(QRect(70, 500, 101, 21));
mPGZT1AlarmLabel->setFont(font);
mFNZT1AlarmLabel = new QLabel(CModbusPage);
mFNZT1AlarmLabel->setObjectName(QString::fromUtf8("mFNZT1AlarmLabel"));
mFNZT1AlarmLabel->setEnabled(false);
mFNZT1AlarmLabel->setGeometry(QRect(60, 530, 121, 21));
mFNZT1AlarmLabel->setFont(font);
mZT1AlarmeLabel = new QLabel(CModbusPage);
mZT1AlarmeLabel->setObjectName(QString::fromUtf8("mZT1AlarmeLabel"));
mZT1AlarmeLabel->setEnabled(false);
mZT1AlarmeLabel->setGeometry(QRect(50, 260, 91, 21));
QFont font1;
font1.setPointSize(12);
font1.setUnderline(true);
mZT1AlarmeLabel->setFont(font1);
mZT1RangLabel = new QLabel(CModbusPage);
mZT1RangLabel->setObjectName(QString::fromUtf8("mZT1RangLabel"));
mZT1RangLabel->setEnabled(false);
mZT1RangLabel->setGeometry(QRect(190, 260, 61, 21));
mZT1RangLabel->setFont(font1);
mZT1RangAlarmeLabel = new QLabel(CModbusPage);
mZT1RangAlarmeLabel->setObjectName(QString::fromUtf8("mZT1RangAlarmeLabel"));
mZT1RangAlarmeLabel->setEnabled(false);
mZT1RangAlarmeLabel->setGeometry(QRect(240, 230, 71, 20));
mZT1RangAlarmeLabel->setFont(font);
mZT1RangFNLabel = new QLabel(CModbusPage);
mZT1RangFNLabel->setObjectName(QString::fromUtf8("mZT1RangFNLabel"));
mZT1RangFNLabel->setEnabled(false);
mZT1RangFNLabel->setGeometry(QRect(190, 530, 71, 21));
mZT1RangFNLabel->setFont(font);
mZT2AlarmeLabel = new QLabel(CModbusPage);
mZT2AlarmeLabel->setObjectName(QString::fromUtf8("mZT2AlarmeLabel"));
mZT2AlarmeLabel->setEnabled(false);
mZT2AlarmeLabel->setGeometry(QRect(320, 260, 91, 21));
mZT2AlarmeLabel->setFont(font1);
mPPIZT2AlarmLabel = new QLabel(CModbusPage);
mPPIZT2AlarmLabel->setObjectName(QString::fromUtf8("mPPIZT2AlarmLabel"));
mPPIZT2AlarmLabel->setEnabled(false);
mPPIZT2AlarmLabel->setGeometry(QRect(280, 290, 161, 16));
mPPIZT2AlarmLabel->setFont(font);
mPPEZT2AlarmLabel = new QLabel(CModbusPage);
mPPEZT2AlarmLabel->setObjectName(QString::fromUtf8("mPPEZT2AlarmLabel"));
mPPEZT2AlarmLabel->setEnabled(false);
mPPEZT2AlarmLabel->setGeometry(QRect(280, 310, 161, 16));
mPPEZT2AlarmLabel->setFont(font);
mZT2RangLabel = new QLabel(CModbusPage);
mZT2RangLabel->setObjectName(QString::fromUtf8("mZT2RangLabel"));
mZT2RangLabel->setEnabled(false);
mZT2RangLabel->setGeometry(QRect(460, 260, 61, 21));
mZT2RangLabel->setFont(font1);
mZT2RangAlarmeLabel = new QLabel(CModbusPage);
mZT2RangAlarmeLabel->setObjectName(QString::fromUtf8("mZT2RangAlarmeLabel"));
mZT2RangAlarmeLabel->setEnabled(false);
mZT2RangAlarmeLabel->setGeometry(QRect(460, 300, 71, 21));
mZT2RangAlarmeLabel->setFont(font);
mPEQ1AlarmLabel = new QLabel(CModbusPage);
mPEQ1AlarmLabel->setObjectName(QString::fromUtf8("mPEQ1AlarmLabel"));
mPEQ1AlarmLabel->setEnabled(false);
mPEQ1AlarmLabel->setGeometry(QRect(40, 560, 141, 21));
mPEQ1AlarmLabel->setFont(font);
mPEQ2AlarmLabel = new QLabel(CModbusPage);
mPEQ2AlarmLabel->setObjectName(QString::fromUtf8("mPEQ2AlarmLabel"));
mPEQ2AlarmLabel->setEnabled(false);
mPEQ2AlarmLabel->setGeometry(QRect(290, 350, 141, 21));
mPEQ2AlarmLabel->setFont(font);
mV00AlarmLabel = new QLabel(CModbusPage);
mV00AlarmLabel->setObjectName(QString::fromUtf8("mV00AlarmLabel"));
mV00AlarmLabel->setEnabled(false);
mV00AlarmLabel->setGeometry(QRect(20, 580, 161, 21));
mV00AlarmLabel->setFont(font);
mV02AlarmLabel = new QLabel(CModbusPage);
mV02AlarmLabel->setObjectName(QString::fromUtf8("mV02AlarmLabel"));
mV02AlarmLabel->setEnabled(false);
mV02AlarmLabel->setGeometry(QRect(290, 370, 161, 21));
mV02AlarmLabel->setFont(font);
line_2 = new QFrame(CModbusPage);
line_2->setObjectName(QString::fromUtf8("line_2"));
line_2->setEnabled(false);
line_2->setGeometry(QRect(440, 290, 20, 41));
line_2->setFrameShape(QFrame::VLine);
line_2->setFrameShadow(QFrame::Sunken);
line_3 = new QFrame(CModbusPage);
line_3->setObjectName(QString::fromUtf8("line_3"));
line_3->setGeometry(QRect(540, 160, 20, 591));
line_3->setFrameShape(QFrame::VLine);
line_3->setFrameShadow(QFrame::Sunken);
mSimSEITitleLabel = new QLabel(CModbusPage);
mSimSEITitleLabel->setObjectName(QString::fromUtf8("mSimSEITitleLabel"));
mSimSEITitleLabel->setGeometry(QRect(650, 260, 291, 31));
mSimSEITitleLabel->setAlignment(Qt::AlignCenter);
mZTAutoReqDelay = new QLineEdit(CModbusPage);
mZTAutoReqDelay->setObjectName(QString::fromUtf8("mZTAutoReqDelay"));
mZTAutoReqDelay->setGeometry(QRect(150, 80, 31, 20));
mReqDelayLabel = new QLabel(CModbusPage);
mReqDelayLabel->setObjectName(QString::fromUtf8("mReqDelayLabel"));
mReqDelayLabel->setGeometry(QRect(40, 80, 111, 20));
mSendModbusReadBtn = new QPushButton(CModbusPage);
mSendModbusReadBtn->setObjectName(QString::fromUtf8("mSendModbusReadBtn"));
mSendModbusReadBtn->setGeometry(QRect(240, 80, 75, 23));
mAutoRequestChkBx = new QCheckBox(CModbusPage);
mAutoRequestChkBx->setObjectName(QString::fromUtf8("mAutoRequestChkBx"));
mAutoRequestChkBx->setGeometry(QRect(190, 80, 70, 17));
mStayOnTopChkBx = new QCheckBox(CModbusPage);
mStayOnTopChkBx->setObjectName(QString::fromUtf8("mStayOnTopChkBx"));
mStayOnTopChkBx->setGeometry(QRect(40, 100, 70, 17));
mPPI2ZT1AlarmLabel = new QLabel(CModbusPage);
mPPI2ZT1AlarmLabel->setObjectName(QString::fromUtf8("mPPI2ZT1AlarmLabel"));
mPPI2ZT1AlarmLabel->setEnabled(false);
mPPI2ZT1AlarmLabel->setGeometry(QRect(10, 310, 171, 16));
mPPI2ZT1AlarmLabel->setFont(font);
mPPI3ZT1AlarmLabel = new QLabel(CModbusPage);
mPPI3ZT1AlarmLabel->setObjectName(QString::fromUtf8("mPPI3ZT1AlarmLabel"));
mPPI3ZT1AlarmLabel->setEnabled(false);
mPPI3ZT1AlarmLabel->setGeometry(QRect(10, 330, 171, 16));
mPPI3ZT1AlarmLabel->setFont(font);
mPPIZT1AlarmLabel_4 = new QLabel(CModbusPage);
mPPIZT1AlarmLabel_4->setObjectName(QString::fromUtf8("mPPIZT1AlarmLabel_4"));
mPPIZT1AlarmLabel_4->setEnabled(false);
mPPIZT1AlarmLabel_4->setGeometry(QRect(10, 350, 171, 16));
mPPIZT1AlarmLabel_4->setFont(font);
mPPI2ZT1Rank = new QLabel(CModbusPage);
mPPI2ZT1Rank->setObjectName(QString::fromUtf8("mPPI2ZT1Rank"));
mPPI2ZT1Rank->setEnabled(false);
mPPI2ZT1Rank->setGeometry(QRect(200, 310, 81, 16));
mPPI2ZT1Rank->setFont(font);
mPPI1ZT1Rank = new QLabel(CModbusPage);
mPPI1ZT1Rank->setObjectName(QString::fromUtf8("mPPI1ZT1Rank"));
mPPI1ZT1Rank->setEnabled(false);
mPPI1ZT1Rank->setGeometry(QRect(200, 290, 81, 16));
mPPI1ZT1Rank->setFont(font);
mPPI3ZT1Rank = new QLabel(CModbusPage);
mPPI3ZT1Rank->setObjectName(QString::fromUtf8("mPPI3ZT1Rank"));
mPPI3ZT1Rank->setEnabled(false);
mPPI3ZT1Rank->setGeometry(QRect(200, 330, 81, 16));
mPPI3ZT1Rank->setFont(font);
mPPIZT1AlarmLabel_5 = new QLabel(CModbusPage);
mPPIZT1AlarmLabel_5->setObjectName(QString::fromUtf8("mPPIZT1AlarmLabel_5"));
mPPIZT1AlarmLabel_5->setEnabled(false);
mPPIZT1AlarmLabel_5->setGeometry(QRect(200, 350, 81, 16));
mPPIZT1AlarmLabel_5->setFont(font);
mPPEZT1AlarmLabel_2 = new QLabel(CModbusPage);
mPPEZT1AlarmLabel_2->setObjectName(QString::fromUtf8("mPPEZT1AlarmLabel_2"));
mPPEZT1AlarmLabel_2->setEnabled(false);
mPPEZT1AlarmLabel_2->setGeometry(QRect(20, 400, 161, 16));
mPPEZT1AlarmLabel_2->setFont(font);
mPPEZT1AlarmLabel_3 = new QLabel(CModbusPage);
mPPEZT1AlarmLabel_3->setObjectName(QString::fromUtf8("mPPEZT1AlarmLabel_3"));
mPPEZT1AlarmLabel_3->setEnabled(false);
mPPEZT1AlarmLabel_3->setGeometry(QRect(20, 420, 161, 16));
mPPEZT1AlarmLabel_3->setFont(font);
mPPEZT1AlarmLabel_4 = new QLabel(CModbusPage);
mPPEZT1AlarmLabel_4->setObjectName(QString::fromUtf8("mPPEZT1AlarmLabel_4"));
mPPEZT1AlarmLabel_4->setEnabled(false);
mPPEZT1AlarmLabel_4->setGeometry(QRect(20, 440, 161, 16));
mPPEZT1AlarmLabel_4->setFont(font);
mCCModbusTable = new QTableWidget(CModbusPage);
mCCModbusTable->setObjectName(QString::fromUtf8("mCCModbusTable"));
mCCModbusTable->setEnabled(false);
mCCModbusTable->setGeometry(QRect(630, 330, 621, 471));
mCCModbusDataTree = new QTreeWidget(CModbusPage);
QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem();
__qtreewidgetitem->setText(0, QString::fromUtf8("1"));
mCCModbusDataTree->setHeaderItem(__qtreewidgetitem);
mCCModbusDataTree->setObjectName(QString::fromUtf8("mCCModbusDataTree"));
mCCModbusDataTree->setGeometry(QRect(10, 150, 511, 611));
mZTC1Btn = new QPushButton(CModbusPage);
mZTC1Btn->setObjectName(QString::fromUtf8("mZTC1Btn"));
mZTC1Btn->setGeometry(QRect(340, 120, 81, 23));
mAN1Btn_3 = new QPushButton(CModbusPage);
mAN1Btn_3->setObjectName(QString::fromUtf8("mAN1Btn_3"));
mAN1Btn_3->setGeometry(QRect(450, 120, 81, 23));
mActivityBitmap = new QLabel(CModbusPage);
mActivityBitmap->setObjectName(QString::fromUtf8("mActivityBitmap"));
mActivityBitmap->setGeometry(QRect(190, 100, 31, 21));
mWatchdogChkBx = new QCheckBox(CModbusPage);
mWatchdogChkBx->setObjectName(QString::fromUtf8("mWatchdogChkBx"));
mWatchdogChkBx->setGeometry(QRect(110, 100, 70, 17));
mDateTimeBtn = new QPushButton(CModbusPage);
mDateTimeBtn->setObjectName(QString::fromUtf8("mDateTimeBtn"));
mDateTimeBtn->setGeometry(QRect(240, 110, 81, 23));
mZT1Compo1 = new QSpinBox(CModbusPage);
mZT1Compo1->setObjectName(QString::fromUtf8("mZT1Compo1"));
mZT1Compo1->setGeometry(QRect(590, 90, 61, 22));
mZT1Compo1->setMaximum(999);
mZT1Compo2 = new QSpinBox(CModbusPage);
mZT1Compo2->setObjectName(QString::fromUtf8("mZT1Compo2"));
mZT1Compo2->setGeometry(QRect(660, 90, 61, 22));
mZT1Compo2->setMaximum(999);
mZT1Compo3 = new QSpinBox(CModbusPage);
mZT1Compo3->setObjectName(QString::fromUtf8("mZT1Compo3"));
mZT1Compo3->setGeometry(QRect(730, 90, 61, 22));
mZT1Compo3->setMaximum(999);
mZT2Compo1 = new QSpinBox(CModbusPage);
mZT2Compo1->setObjectName(QString::fromUtf8("mZT2Compo1"));
mZT2Compo1->setGeometry(QRect(590, 150, 61, 22));
mZT2Compo1->setMaximum(999);
mZT2Compo2 = new QSpinBox(CModbusPage);
mZT2Compo2->setObjectName(QString::fromUtf8("mZT2Compo2"));
mZT2Compo2->setGeometry(QRect(660, 150, 61, 22));
mZT2Compo2->setMaximum(999);
mZT2Compo3 = new QSpinBox(CModbusPage);
mZT2Compo3->setObjectName(QString::fromUtf8("mZT2Compo3"));
mZT2Compo3->setGeometry(QRect(730, 150, 61, 22));
mZT2Compo3->setMaximum(999);
mSetTrainParamBtn = new QPushButton(CModbusPage);
mSetTrainParamBtn->setObjectName(QString::fromUtf8("mSetTrainParamBtn"));
mSetTrainParamBtn->setGeometry(QRect(580, 190, 75, 23));
mZT1TrainTypeBox = new QComboBox(CModbusPage);
mZT1TrainTypeBox->setObjectName(QString::fromUtf8("mZT1TrainTypeBox"));
mZT1TrainTypeBox->setGeometry(QRect(800, 90, 91, 22));
mZT2TrainTypeBox = new QComboBox(CModbusPage);
mZT2TrainTypeBox->setObjectName(QString::fromUtf8("mZT2TrainTypeBox"));
mZT2TrainTypeBox->setGeometry(QRect(800, 150, 91, 22));
label = new QLabel(CModbusPage);
label->setObjectName(QString::fromUtf8("label"));
label->setGeometry(QRect(590, 70, 301, 20));
label_2 = new QLabel(CModbusPage);
label_2->setObjectName(QString::fromUtf8("label_2"));
label_2->setGeometry(QRect(590, 130, 301, 20));
mZT1InhibPassChkBx = new QCheckBox(CModbusPage);
mZT1InhibPassChkBx->setObjectName(QString::fromUtf8("mZT1InhibPassChkBx"));
mZT1InhibPassChkBx->setGeometry(QRect(910, 90, 70, 17));
mZT2InhibPassChkBx = new QCheckBox(CModbusPage);
mZT2InhibPassChkBx->setObjectName(QString::fromUtf8("mZT2InhibPassChkBx"));
mZT2InhibPassChkBx->setGeometry(QRect(910, 150, 70, 17));
pushButton = new QPushButton(CModbusPage);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
pushButton->setGeometry(QRect(800, 210, 75, 23));
retranslateUi(CModbusPage);
QMetaObject::connectSlotsByName(CModbusPage);
} // setupUi
void retranslateUi(QWidget *CModbusPage)
{
CModbusPage->setWindowTitle(QCoreApplication::translate("CModbusPage", "Form", nullptr));
mAN1Btn->setText(QCoreApplication::translate("CModbusPage", "Envoyer AN1", nullptr));
mAN2Btn->setText(QCoreApplication::translate("CModbusPage", "Envoyer AN2", nullptr));
mSimCCTitleLabel->setText(QCoreApplication::translate("CModbusPage", "SIMULATEUR COMMANDE CENTRALIS\303\211E", nullptr));
mCCEventsList->setHtml(QCoreApplication::translate("CModbusPage", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">\303\211v\303\251nements CC:</span></p></body></html>", nullptr));
mZTIPAddressLineEdit->setText(QCoreApplication::translate("CModbusPage", "192.168.3.102", nullptr));
mZTPortLineEdit->setText(QCoreApplication::translate("CModbusPage", "502", nullptr));
mConnectBtn->setText(QCoreApplication::translate("CModbusPage", "Connecter", nullptr));
mPPI1ZT1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Int\303\251rieur 1", nullptr));
mPPEZT1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Ext\303\251rieur 1", nullptr));
mPGZT1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Guidage", nullptr));
mFNZT1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Frotteur N\303\251gatif", nullptr));
mZT1AlarmeLabel->setText(QCoreApplication::translate("CModbusPage", "Alarme ZT1", nullptr));
mZT1RangLabel->setText(QCoreApplication::translate("CModbusPage", "Rang", nullptr));
mZT1RangAlarmeLabel->setText(QCoreApplication::translate("CModbusPage", "asdfasdf", nullptr));
mZT1RangFNLabel->setText(QCoreApplication::translate("CModbusPage", "--", nullptr));
mZT2AlarmeLabel->setText(QCoreApplication::translate("CModbusPage", "Alarme ZT2", nullptr));
mPPIZT2AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Int\303\251rieur", nullptr));
mPPEZT2AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Ext\303\251rieur", nullptr));
mZT2RangLabel->setText(QCoreApplication::translate("CModbusPage", "Rang", nullptr));
mZT2RangAlarmeLabel->setText(QCoreApplication::translate("CModbusPage", "--", nullptr));
mPEQ1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Panne \303\211quipement", nullptr));
mPEQ2AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Panne \303\211quipement", nullptr));
mV00AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Erreur comptage V00", nullptr));
mV02AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Erreur comptage V02", nullptr));
mSimSEITitleLabel->setText(QCoreApplication::translate("CModbusPage", "SIMULATEUR SEI", nullptr));
mZTAutoReqDelay->setText(QCoreApplication::translate("CModbusPage", "300", nullptr));
mReqDelayLabel->setText(QCoreApplication::translate("CModbusPage", "D\303\251lai de requ\303\252te (ms)", nullptr));
mSendModbusReadBtn->setText(QCoreApplication::translate("CModbusPage", "Lire", nullptr));
mAutoRequestChkBx->setText(QCoreApplication::translate("CModbusPage", "Auto", nullptr));
mStayOnTopChkBx->setText(QCoreApplication::translate("CModbusPage", "OnTop", nullptr));
mPPI2ZT1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Int\303\251rieur 2", nullptr));
mPPI3ZT1AlarmLabel->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Int\303\251rieur 3", nullptr));
mPPIZT1AlarmLabel_4->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Int\303\251rieur 4", nullptr));
mPPI2ZT1Rank->setText(QCoreApplication::translate("CModbusPage", "0", nullptr));
mPPI1ZT1Rank->setText(QCoreApplication::translate("CModbusPage", "0", nullptr));
mPPI3ZT1Rank->setText(QCoreApplication::translate("CModbusPage", "0", nullptr));
mPPIZT1AlarmLabel_5->setText(QCoreApplication::translate("CModbusPage", "0", nullptr));
mPPEZT1AlarmLabel_2->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Ext\303\251rieur 2", nullptr));
mPPEZT1AlarmLabel_3->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Ext\303\251rieur 3", nullptr));
mPPEZT1AlarmLabel_4->setText(QCoreApplication::translate("CModbusPage", "Pneu Porteur Ext\303\251rieur 4", nullptr));
mZTC1Btn->setText(QCoreApplication::translate("CModbusPage", "Envoyer ZTC1", nullptr));
mAN1Btn_3->setText(QCoreApplication::translate("CModbusPage", "Envoyer ZTC2", nullptr));
mActivityBitmap->setText(QCoreApplication::translate("CModbusPage", "Activity", nullptr));
mWatchdogChkBx->setText(QCoreApplication::translate("CModbusPage", "Watchdog", nullptr));
mDateTimeBtn->setText(QCoreApplication::translate("CModbusPage", "Envoyer Date", nullptr));
mSetTrainParamBtn->setText(QCoreApplication::translate("CModbusPage", "Appliquer", nullptr));
label->setText(QCoreApplication::translate("CModbusPage", "Composition & type train ZT1", nullptr));
label_2->setText(QCoreApplication::translate("CModbusPage", "Composition & type train ZT2", nullptr));
mZT1InhibPassChkBx->setText(QCoreApplication::translate("CModbusPage", "Inhiber", nullptr));
mZT2InhibPassChkBx->setText(QCoreApplication::translate("CModbusPage", "Inhiber", nullptr));
pushButton->setText(QCoreApplication::translate("CModbusPage", "asdfasdf", nullptr));
} // retranslateUi
};
namespace Ui {
class CModbusPage: public Ui_CModbusPage {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_CMODBUSPAGE_H

71
ui_LazerProbeSimPage.h Normal file
View File

@ -0,0 +1,71 @@
/********************************************************************************
** Form generated from reading UI file 'LazerProbeSimPage.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_LAZERPROBESIMPAGE_H
#define UI_LAZERPROBESIMPAGE_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QLabel>
#include <QtWidgets/QSlider>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_CLazerProbeSimPage
{
public:
QCheckBox *mEnableProbeChkBx;
QSlider *mMeasurementValueSlider;
QCheckBox *mOutOfRangeChkBx;
QLabel *mValueDisplayLabel;
void setupUi(QWidget *CLazerProbeSimPage)
{
if (CLazerProbeSimPage->objectName().isEmpty())
CLazerProbeSimPage->setObjectName(QString::fromUtf8("CLazerProbeSimPage"));
CLazerProbeSimPage->resize(1143, 465);
mEnableProbeChkBx = new QCheckBox(CLazerProbeSimPage);
mEnableProbeChkBx->setObjectName(QString::fromUtf8("mEnableProbeChkBx"));
mEnableProbeChkBx->setGeometry(QRect(130, 160, 70, 17));
mMeasurementValueSlider = new QSlider(CLazerProbeSimPage);
mMeasurementValueSlider->setObjectName(QString::fromUtf8("mMeasurementValueSlider"));
mMeasurementValueSlider->setGeometry(QRect(100, 90, 291, 19));
mMeasurementValueSlider->setMinimum(100000);
mMeasurementValueSlider->setMaximum(200000);
mMeasurementValueSlider->setOrientation(Qt::Horizontal);
mOutOfRangeChkBx = new QCheckBox(CLazerProbeSimPage);
mOutOfRangeChkBx->setObjectName(QString::fromUtf8("mOutOfRangeChkBx"));
mOutOfRangeChkBx->setGeometry(QRect(240, 160, 70, 17));
mValueDisplayLabel = new QLabel(CLazerProbeSimPage);
mValueDisplayLabel->setObjectName(QString::fromUtf8("mValueDisplayLabel"));
mValueDisplayLabel->setGeometry(QRect(210, 40, 46, 13));
retranslateUi(CLazerProbeSimPage);
QMetaObject::connectSlotsByName(CLazerProbeSimPage);
} // setupUi
void retranslateUi(QWidget *CLazerProbeSimPage)
{
CLazerProbeSimPage->setWindowTitle(QCoreApplication::translate("CLazerProbeSimPage", "Form", nullptr));
mEnableProbeChkBx->setText(QCoreApplication::translate("CLazerProbeSimPage", "Activer", nullptr));
mOutOfRangeChkBx->setText(QCoreApplication::translate("CLazerProbeSimPage", "CheckBox", nullptr));
mValueDisplayLabel->setText(QCoreApplication::translate("CLazerProbeSimPage", "TextLabel", nullptr));
} // retranslateUi
};
namespace Ui {
class CLazerProbeSimPage: public Ui_CLazerProbeSimPage {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_LAZERPROBESIMPAGE_H

64
ui_MainPage.h Normal file
View File

@ -0,0 +1,64 @@
/********************************************************************************
** Form generated from reading UI file 'MainPage.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MAINPAGE_H
#define UI_MAINPAGE_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QTabWidget>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_CMainPage
{
public:
QTabWidget *mMainPageTabs;
QWidget *Modbus;
QWidget *Sondes;
void setupUi(QWidget *CMainPage)
{
if (CMainPage->objectName().isEmpty())
CMainPage->setObjectName(QString::fromUtf8("CMainPage"));
CMainPage->resize(1431, 1008);
mMainPageTabs = new QTabWidget(CMainPage);
mMainPageTabs->setObjectName(QString::fromUtf8("mMainPageTabs"));
mMainPageTabs->setGeometry(QRect(10, 0, 1421, 1011));
Modbus = new QWidget();
Modbus->setObjectName(QString::fromUtf8("Modbus"));
mMainPageTabs->addTab(Modbus, QString());
Sondes = new QWidget();
Sondes->setObjectName(QString::fromUtf8("Sondes"));
mMainPageTabs->addTab(Sondes, QString());
retranslateUi(CMainPage);
mMainPageTabs->setCurrentIndex(0);
QMetaObject::connectSlotsByName(CMainPage);
} // setupUi
void retranslateUi(QWidget *CMainPage)
{
CMainPage->setWindowTitle(QCoreApplication::translate("CMainPage", "Form", nullptr));
mMainPageTabs->setTabText(mMainPageTabs->indexOf(Modbus), QCoreApplication::translate("CMainPage", "Tab 1", nullptr));
mMainPageTabs->setTabText(mMainPageTabs->indexOf(Sondes), QCoreApplication::translate("CMainPage", "Tab 2", nullptr));
} // retranslateUi
};
namespace Ui {
class CMainPage: public Ui_CMainPage {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINPAGE_H

94
ui_SEIModbusPage.h Normal file
View File

@ -0,0 +1,94 @@
/********************************************************************************
** Form generated from reading UI file 'SEIModbusPage.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_SEIMODBUSPAGE_H
#define UI_SEIMODBUSPAGE_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTreeWidget>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_CSEIModbusPage
{
public:
QLabel *mSEISimTitleLabel;
QLabel *mSEIConnectStatLabel;
QPushButton *mStartStopServerBtn;
QLabel *mServerLabel;
QTreeWidget *mZTAlarmDataTree;
QCheckBox *mEnableWDChkBx;
QCheckBox *mAN1ChkBx;
QCheckBox *mAN2ChkBx;
void setupUi(QWidget *CSEIModbusPage)
{
if (CSEIModbusPage->objectName().isEmpty())
CSEIModbusPage->setObjectName(QString::fromUtf8("CSEIModbusPage"));
CSEIModbusPage->resize(917, 762);
mSEISimTitleLabel = new QLabel(CSEIModbusPage);
mSEISimTitleLabel->setObjectName(QString::fromUtf8("mSEISimTitleLabel"));
mSEISimTitleLabel->setGeometry(QRect(250, 30, 361, 31));
mSEISimTitleLabel->setTextFormat(Qt::AutoText);
mSEIConnectStatLabel = new QLabel(CSEIModbusPage);
mSEIConnectStatLabel->setObjectName(QString::fromUtf8("mSEIConnectStatLabel"));
mSEIConnectStatLabel->setGeometry(QRect(650, 100, 271, 41));
mStartStopServerBtn = new QPushButton(CSEIModbusPage);
mStartStopServerBtn->setObjectName(QString::fromUtf8("mStartStopServerBtn"));
mStartStopServerBtn->setGeometry(QRect(750, 30, 101, 23));
mServerLabel = new QLabel(CSEIModbusPage);
mServerLabel->setObjectName(QString::fromUtf8("mServerLabel"));
mServerLabel->setGeometry(QRect(780, 10, 46, 13));
mZTAlarmDataTree = new QTreeWidget(CSEIModbusPage);
QTreeWidgetItem *__qtreewidgetitem = new QTreeWidgetItem();
__qtreewidgetitem->setText(0, QString::fromUtf8("1"));
mZTAlarmDataTree->setHeaderItem(__qtreewidgetitem);
mZTAlarmDataTree->setObjectName(QString::fromUtf8("mZTAlarmDataTree"));
mZTAlarmDataTree->setGeometry(QRect(30, 110, 541, 641));
mEnableWDChkBx = new QCheckBox(CSEIModbusPage);
mEnableWDChkBx->setObjectName(QString::fromUtf8("mEnableWDChkBx"));
mEnableWDChkBx->setGeometry(QRect(660, 180, 70, 17));
mAN1ChkBx = new QCheckBox(CSEIModbusPage);
mAN1ChkBx->setObjectName(QString::fromUtf8("mAN1ChkBx"));
mAN1ChkBx->setGeometry(QRect(660, 210, 70, 17));
mAN2ChkBx = new QCheckBox(CSEIModbusPage);
mAN2ChkBx->setObjectName(QString::fromUtf8("mAN2ChkBx"));
mAN2ChkBx->setGeometry(QRect(660, 240, 70, 17));
retranslateUi(CSEIModbusPage);
QMetaObject::connectSlotsByName(CSEIModbusPage);
} // setupUi
void retranslateUi(QWidget *CSEIModbusPage)
{
CSEIModbusPage->setWindowTitle(QCoreApplication::translate("CSEIModbusPage", "Form", nullptr));
mSEISimTitleLabel->setText(QCoreApplication::translate("CSEIModbusPage", "Simulateur SEI", nullptr));
mSEIConnectStatLabel->setText(QCoreApplication::translate("CSEIModbusPage", "ZT:NON CONNECT\303\211E", nullptr));
mStartStopServerBtn->setText(QCoreApplication::translate("CSEIModbusPage", "D\303\251marrer Serveur", nullptr));
mServerLabel->setText(QCoreApplication::translate("CSEIModbusPage", "Serveur", nullptr));
mEnableWDChkBx->setText(QCoreApplication::translate("CSEIModbusPage", "Watchdog", nullptr));
mAN1ChkBx->setText(QCoreApplication::translate("CSEIModbusPage", "AN1", nullptr));
mAN2ChkBx->setText(QCoreApplication::translate("CSEIModbusPage", "AN2", nullptr));
} // retranslateUi
};
namespace Ui {
class CSEIModbusPage: public Ui_CSEIModbusPage {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_SEIMODBUSPAGE_H