From a6683e2058b8e9ae08f672fa12c6d4dd90a33762 Mon Sep 17 00:00:00 2001 From: jfmartel Date: Wed, 4 Oct 2017 09:29:56 -0400 Subject: [PATCH] =?UTF-8?q?Auto=20d=C3=A9tection=20du=20r=C3=A9seau=20Modb?= =?UTF-8?q?us?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout d'une fonction d'aut détection d'une connexion Ethernet sur le port Modbus au démarrage. --- Configuration/ZT.cfg | 10 +++++++--- sources/ZTLog.cpp | 2 +- sources/ZTconfigmgr.cpp | 34 ++++++++++++++++++++++++------- sources/ZTconfigmgr.h | 13 ++++++++++-- sources/Zonetest.cpp | 44 ++++++++++++++++++++++++++++++++++++++++- 5 files changed, 89 insertions(+), 14 deletions(-) diff --git a/Configuration/ZT.cfg b/Configuration/ZT.cfg index e35916f..93dac7b 100644 --- a/Configuration/ZT.cfg +++ b/Configuration/ZT.cfg @@ -45,13 +45,17 @@ SONDE_LASER_INT_1=ttyS2 SONDE_LASER_EXT_1=ttyS1 #---------------------------------- -#Changer cette valeur à OUI ou NON pour sélectionner la communication Modbus -#avec la CC -UTILISER_MODBUS_CC=OUI +#Changer cette valeur à OUI, NON ou AUTO pour sélectionner la communication Modbus avec la CC. +# OUI: force l'utilisation de la communication Modbus avec la CC. +# NON: force la désactivation du lien Modbus avec la CC (utilisation des TC/TK discrètes) +# AUTO: détection du lien Modbus au démarrage de la ZT et autoconfiguration de l'interface. +UTILISER_MODBUS_CC=AUTO #Adresse modbus de la ZT MODBUS_CC_DEVID=1 #Port Modbus/TCP MODBUS_CC_PORT=502 +#Interface Ethernet +MODBUS_CC_ETH_IF=eth2 #---------------------------------- #Changer cette valeur à OUI ou NON pour activer le diff --git a/sources/ZTLog.cpp b/sources/ZTLog.cpp index ab10757..0fd52fb 100644 --- a/sources/ZTLog.cpp +++ b/sources/ZTLog.cpp @@ -82,7 +82,7 @@ void CZTLog::AddLogString(QString string,bool AddToEngLog) return; if(AddToEngLog) - CEngLog::instance()->AddLogString(string); + CEngLog::instance()->AddLogString(string,1); if(string.at(string.length()-1) != '\n') string.append('\n'); diff --git a/sources/ZTconfigmgr.cpp b/sources/ZTconfigmgr.cpp index bf4171a..da9a617 100644 --- a/sources/ZTconfigmgr.cpp +++ b/sources/ZTconfigmgr.cpp @@ -57,7 +57,8 @@ CZTConfigMgr::CZTConfigMgr() mUseSimulator = false; //Modbus communication with CC - mUseModbusCC = false; + mUseModbusCCMode = ZT_CONFIG_MODBUS_ENABLE_AUTODETECT; + mModbusCCIFName = "INVALID"; } ZTConfigResult CZTConfigMgr::LoadZTConfig() @@ -157,13 +158,22 @@ ZTConfigResult CZTConfigMgr::LoadZTConfig() else if(string.contains("UTILISER_MODBUS_CC")) { if(string.mid(pos) == "OUI") - mUseModbusCC = true; + { + mUseModbusCCMode = ZT_CONFIG_MODBUS_ENABLE_FORCE_ON; + CEngLog::instance()->AddLogString(QString().sprintf("Comm. Modbus avec la CC activée (forcée)"),1); + } else if(string.mid(pos) == "NON") - mUseSimulator = false; + { + mUseModbusCCMode = ZT_CONFIG_MODBUS_ENABLE_FORCE_OFF; + CEngLog::instance()->AddLogString(QString().sprintf("Comm. Modbus avec la CC désactivée (forcée)"),1); + } + else if(string.mid(pos) == "AUTO") + { + mUseModbusCCMode = ZT_CONFIG_MODBUS_ENABLE_AUTODETECT; + CEngLog::instance()->AddLogString(QString().sprintf("Comm. Modbus avec la CC = détection automatique"),1); + } else CEngLog::instance()->AddLogString(QString().sprintf("Invalid MODBUS_CC parameter: %s",string.mid(pos).toUtf8().constData())); - - CEngLog::instance()->AddLogString(QString().sprintf("Comm. Modbus avec la CC = %d",mUseModbusCC)); } else if(string.contains("MODBUS_CC_DEVID")) { @@ -190,6 +200,11 @@ ZTConfigResult CZTConfigMgr::LoadZTConfig() } CEngLog::instance()->AddLogString(QString().sprintf("Port Modbus CC = %d",mModbusCCPort)); } + else if(string.contains("MODBUS_CC_ETH_IF")) + { + mModbusCCIFName = (string.mid(pos)); + CEngLog::instance()->AddLogString(QString("Interface Modbus CC = %1").arg(mModbusCCIFName),1); + } //Station configuration parameters else if(string.contains("STATION")) @@ -265,15 +280,20 @@ bool CZTConfigMgr::GetSimulatorEnabled() return mUseSimulator; } -bool CZTConfigMgr::GetModbusCCEnabled() +ZTConfigModbusEnableMode CZTConfigMgr::GetModbusCCEnabled() { - return mUseModbusCC; + return mUseModbusCCMode; } int CZTConfigMgr::GetModbusCCDevID() { return mModbusCCDevID; } +QString CZTConfigMgr::GetModbusCCIFName() +{ + return mModbusCCIFName; +} + int CZTConfigMgr::GetModbusCCPort() { return mModbusCCPort; diff --git a/sources/ZTconfigmgr.h b/sources/ZTconfigmgr.h index 08105ab..386292c 100644 --- a/sources/ZTconfigmgr.h +++ b/sources/ZTconfigmgr.h @@ -44,6 +44,13 @@ typedef enum eZTConfigResult ZT_CONFIG_PARAMETER_ERROR }ZTConfigResult; +typedef enum eZTConfigModbusEnableMode +{ + ZT_CONFIG_MODBUS_ENABLE_FORCE_ON, + ZT_CONFIG_MODBUS_ENABLE_FORCE_OFF, + ZT_CONFIG_MODBUS_ENABLE_AUTODETECT +}ZTConfigModbusEnableMode; + typedef struct stExtModulesConfig { @@ -83,9 +90,10 @@ public: QList *GetLazerProbesConfigList(void); int GetEngLog(void); bool GetSimulatorEnabled(); - bool GetModbusCCEnabled(); + ZTConfigModbusEnableMode GetModbusCCEnabled(); int GetModbusCCPort(); int GetModbusCCDevID(); + QString GetModbusCCIFName(); // int GetLaserSensorCalib(){return mConfig_Station_LaserSensorCalib;} @@ -100,10 +108,11 @@ private: QList mConfig_LazerProbeModulesConfigList; QString mConfig_Station_StationName; + QString mModbusCCIFName; // int mConfig_Station_LaserSensorCalib; int mEngLogVerbosity; bool mUseSimulator; - bool mUseModbusCC; + ZTConfigModbusEnableMode mUseModbusCCMode; int mModbusCCDevID; int mModbusCCPort; diff --git a/sources/Zonetest.cpp b/sources/Zonetest.cpp index 8ef6980..1e64d55 100644 --- a/sources/Zonetest.cpp +++ b/sources/Zonetest.cpp @@ -483,7 +483,48 @@ unsigned int CZoneTest::InitZT() mExtIOThread->start(QThread::NormalPriority); - if(CZTConfigMgr::instance()->GetModbusCCEnabled() == true) + bool UseModbusInterface = false; + if(CZTConfigMgr::instance()->GetModbusCCEnabled() != ZT_CONFIG_MODBUS_ENABLE_FORCE_OFF) + { + if(CZTConfigMgr::instance()->GetModbusCCEnabled() == ZT_CONFIG_MODBUS_ENABLE_FORCE_ON) + { + CEngLog::instance()->AddLogString("Interface Modbus activée (forcée)",1); + UseModbusInterface = true; + } + else + { + //autodetect modbus interface... + CEngLog::instance()->AddLogString("Auto-Détection de l'interface Modbus",1); + QString IFName = CZTConfigMgr::instance()->GetModbusCCIFName(); + if(IFName != "INVALID") + { + QString CarrierFile = QString("/sys/class/net/%1/carrier").arg(IFName); + QFile *EthIfStateFile = new QFile(CarrierFile); + if(EthIfStateFile) + { + CEngLog::instance()->AddLogString(QString("Ouverture du fichier %1 ...").arg(IFName),3); + if(EthIfStateFile->open(QIODevice::ReadOnly | QIODevice::Text) == true) + { + QByteArray val = EthIfStateFile->readAll(); + QString State(val); + if(State.contains("1")) + { + CZTLog::instance()->AddLogString(QString("Connexion Ethernet CC détectée sur %1").arg(IFName),true); + UseModbusInterface = true; + } + else + { + CZTLog::instance()->AddLogString(QString("Connexion Ethernet CC inactive ou non-détectée sur %1").arg(IFName),true); + } + EthIfStateFile->close(); + } + delete EthIfStateFile; + } + } + } + } + + if(UseModbusInterface == true) { int ModbusPort = CZTConfigMgr::instance()->GetModbusCCPort(); int DevID = CZTConfigMgr::instance()->GetModbusCCDevID(); @@ -492,6 +533,7 @@ unsigned int CZoneTest::InitZT() if(DevID >= 255) { mWelcomePagePtr->InsertTextBoxString(QString("Valeur DevID Modbus CC invalide (%1)").arg(DevID)); + CEngLog::instance()->AddLogString(QString("Valeur DevID Modbus CC invalide (%1)").arg(DevID),1); EnterDeadlockState(); return RET_ERROR; }