Auto détection du réseau Modbus

Ajout d'une fonction d'aut détection d'une connexion Ethernet sur le
port Modbus au démarrage.
This commit is contained in:
jfmartel 2017-10-04 09:29:56 -04:00
parent 36e387b152
commit a6683e2058
5 changed files with 89 additions and 14 deletions

View File

@ -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

View File

@ -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');

View File

@ -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;

View File

@ -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<stLazerProbesConfig_t> *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<stLazerProbesConfig_t> mConfig_LazerProbeModulesConfigList;
QString mConfig_Station_StationName;
QString mModbusCCIFName;
// int mConfig_Station_LaserSensorCalib;
int mEngLogVerbosity;
bool mUseSimulator;
bool mUseModbusCC;
ZTConfigModbusEnableMode mUseModbusCCMode;
int mModbusCCDevID;
int mModbusCCPort;

View File

@ -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;
}