This commit is contained in:
zhouhuang 2024-12-10 14:25:46 +08:00
parent 37328f6097
commit c61e97cd4d
5 changed files with 48 additions and 25 deletions

View File

@ -382,7 +382,7 @@ static void* ryftp_process(void* param)
char* escaped_string = escape_char_in_string(mbt->m_remotePath, ' ');
if (escaped_string == NULL)
{
vLog(LOG_DEBUG, "路径转义错误!\n");
vLog(LOG_DEBUG, "%s 路径转义错误!\n", processName);
return ((void*)0);
}
snprintf(remotePath, sizeof(remotePath), "%s", escaped_string);
@ -488,7 +488,7 @@ static void* ryftp_process(void* param)
vLog(LOG_DEBUG, "%s get %s to local memory, with name: %s, and password: %s okay, and file length is: %d.\n", processName, remote, user, password, chunk.size);
ftpget_retry_count = 0;
if (chunk.size <= (int)(sizeof(struRYDeviceData) << 5)) {
vLog(LOG_DEBUG, "PLC文件生成未完成\n");
vLog(LOG_DEBUG, "%s PLC文件生成未完成\n", processName);
continue;
}
@ -784,6 +784,7 @@ BOOLEAN CHostADSBFProcess::calc(void)
void CHostADSBFProcess::tryStartup()
{
m_turbine = NULL;
pthread_setname_np(pthread_self(), m_pidName.c_str());
while (m_threadRun) {
if (m_turbine == NULL) {
SetLocalAmsNetId(AmsNetId(m_localNetId));
@ -836,11 +837,14 @@ BOOLEAN CHostADSBFProcess::OnPreCreate(int id)
m_bHaveFTP = m_nOptions.bHaveFTP;
calc();
vLog(LOG_DEBUG, "%s local ip is: %s, netid is: %s, remote ip is: %s, and netid is: %s\n", m_pidName.c_str(), m_localIp.c_str(), m_localNetId.c_str(), m_remoteIp.c_str(), m_remoteNetId.c_str());
//vLog(LOG_DEBUG, "%s local ip is: %s, netid is: %s, remote ip is: %s, and netid is: %s\n", m_pidName.c_str(), m_localIp.c_str(), m_localNetId.c_str(), m_remoteIp.c_str(), m_remoteNetId.c_str());
m_turbine = NULL;
SetLocalAmsNetId(AmsNetId(m_localNetId));
#if 0
m_threadRun = TRUE;
m_startup = std::thread(&CHostADSBFProcess::tryStartup, this);
#endif
if (m_bHaveFTP)
{
snprintf(m_user, sizeof(m_user), "%s", m_nOptions.ftp.user);
@ -877,7 +881,7 @@ BOOLEAN CHostADSBFProcess::OnPreCreate(int id)
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
if (pthread_create(&m_pid, &attr, ryftp_process, this) < 0) {
vLog(LOG_ERROR, "create ryftp_process error(%d,%s).\n", errno, strerror(errno));
vLog(LOG_ERROR, "ads create ryftp_process error(%d,%s).\n", errno, strerror(errno));
return TRUE;
}
char name[17];
@ -910,9 +914,22 @@ BOOLEAN CHostADSBFProcess::OnTimer(void)
}
if (sec_changed)
{
if (m_turbine == NULL) return TRUE;
if (m_turbine == NULL) {
m_turbine = new AdsDevice{m_remoteIp, AmsNetId(m_remoteNetId), m_remotePort};
const auto state = m_turbine->GetState();
//vLog(LOG_DEBUG, "%s ADS state: %d devState: %d\n", m_pidName.c_str(), (uint16_t)state.ads, (uint16_t)state.device);
if ((uint16_t)state.ads >= ADSSTATE::ADSSTATE_MAXSTATES || (uint16_t)state.device >= ADSSTATE::ADSSTATE_MAXSTATES)
{
vLog(LOG_DEBUG, "read device state error.\n");
long ret = AddRemoteRoute(m_remoteIp, m_localNetId, m_localIp, std::string("isoftstone"), std::string("admin"), std::string("admin"));
vLog(LOG_DEBUG, "bbb %s add route return value is: %d\n", m_pidName.c_str(), ret);
delete m_turbine;
m_turbine = NULL;
}
return TRUE;
}
if (!m_turbine->IsConnected()) return TRUE;
try {
//try {
if (m_bHaveFTP)
{ //启动时读取一次,后面自己维护序号
if ((m_currentDirNo == -1) && (m_currentFileNo == -1))
@ -921,11 +938,11 @@ BOOLEAN CHostADSBFProcess::OnTimer(void)
}
}
readRealData();
} catch (const AdsException& ex) {
vLog(LOG_ERROR, "%s AdsException message: %s, remote is: %s:%d\n", m_pidName.c_str(), ex.what(), m_remoteIp.c_str(), m_remotePort);
} catch (const std::runtime_error& ex) {
vLog(LOG_ERROR, "%s %s\n", m_pidName.c_str(), ex.what());
}
// } catch (const AdsException& ex) {
// vLog(LOG_ERROR, "%s AdsException message: %s, remote is: %s:%d\n", m_pidName.c_str(), ex.what(), m_remoteIp.c_str(), m_remotePort);
// } catch (const std::runtime_error& ex) {
// vLog(LOG_ERROR, "%s %s\n", m_pidName.c_str(), ex.what());
// }
}
return TRUE;
}
@ -981,7 +998,7 @@ BOOLEAN CHostADSBFProcess::readFileID()
//判断是否有要读取的文件
if (m_curStartDirNo <= m_lastReadDirNo && m_curStartFileNo <= m_lastReadFileNo)
{
vLog(LOG_DEBUG, "不存在未读的文件。\n");
vLog(LOG_DEBUG, "%s 不存在未读的文件。\n", m_pidName.c_str());
m_bHaveUnReadFile = FALSE;
}
else

View File

@ -416,12 +416,12 @@ static void* ryftp_process(void* param)
//char pathName[128] = "./";
char processName[128];
snprintf(processName, sizeof(processName), "%s", mbt->GetCurProcessName());
snprintf(processName, sizeof(processName), "%s", mbt->m_pidName.c_str());
//配置远方路径
char* escaped_string = escape_char_in_string(mbt->m_remotePath, ' ');
if (escaped_string == NULL)
{
vLog(LOG_DEBUG, "路径转义错误!\n");
vLog(LOG_DEBUG, "%s 路径转义错误!\n", processName);
return ((void*)0);
}
snprintf(remotePath, sizeof(remotePath), "%s", escaped_string);
@ -527,7 +527,7 @@ static void* ryftp_process(void* param)
vLog(LOG_DEBUG, "%s get %s to local memory, with name: %s, and password: %s okay, and file length is: %d.\n", processName, remote, user, password, chunk.size);
ftpget_retry_count = 0;
if (chunk.size <= (int)(sizeof(struRYDeviceData) << 5)) {
vLog(LOG_DEBUG, "PLC文件生成未完成\n");
vLog(LOG_DEBUG, "%s PLC文件生成未完成\n", processName);
continue;
}
@ -1115,6 +1115,8 @@ BOOLEAN CHostModbusTcpBFProcess::OnPreCreate(int id)
return FALSE;
}
m_pidName = std::string(GetCurProcessName());
m_bHaveFTP = m_nOptions.bHaveFTP;
m_nTimeout = 200;
calc2();
@ -1146,7 +1148,7 @@ BOOLEAN CHostModbusTcpBFProcess::OnPreCreate(int id)
//启动后创建ftp线程
if (m_pid <= 0) {
m_bFtpRun = TRUE;
vLog(LOG_DEBUG, "create a ftp thread.\n");
vLog(LOG_DEBUG, "rymodbus create a ftp thread.\n");
pthread_attr_t attr;
pthread_attr_init(&attr);
@ -1154,11 +1156,11 @@ BOOLEAN CHostModbusTcpBFProcess::OnPreCreate(int id)
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
if (pthread_create(&m_pid, &attr, ryftp_process, this) < 0) {
vLog(LOG_ERROR, "create ryftp_process error(%d,%s).\n", errno, strerror(errno));
vLog(LOG_ERROR, "rymodbus create ryftp_process error(%d,%s).\n", errno, strerror(errno));
return TRUE;
}
char name[17];
snprintf(name, 16, "%s_ftp", GetCurProcessName());
snprintf(name, 16, "%s_ftp", m_pidName.c_str());
pthread_setname_np(m_pid, name);
pthread_attr_destroy(&attr);
@ -1754,7 +1756,7 @@ BOOLEAN CHostModbusTcpBFProcess::OnReceiveIDData(CHostModbusTcpBFProcessItem *pI
m_iv = iv;
if (iv) {
vLog(LOG_DEBUG, "路径信息无效\n");
vLog(LOG_DEBUG, "%s 路径信息无效\n", m_pidName.c_str());
return FALSE;
}
//当前文件夹路径名
@ -1770,7 +1772,7 @@ BOOLEAN CHostModbusTcpBFProcess::OnReceiveIDData(CHostModbusTcpBFProcessItem *pI
//判断是否有要读取的文件
if (m_curStartDirNo <= m_lastReadDirNo && m_curStartFileNo <= m_lastReadFileNo)
{
vLog(LOG_DEBUG, "不存在未读的文件。\n");
vLog(LOG_DEBUG, "%s 不存在未读的文件。\n", m_pidName.c_str());
m_bHaveUnReadFile = FALSE;
}
else
@ -1778,10 +1780,10 @@ BOOLEAN CHostModbusTcpBFProcess::OnReceiveIDData(CHostModbusTcpBFProcessItem *pI
m_bHaveUnReadFile = TRUE;
int dir_count = m_curStartDirNo - m_lastReadDirNo + 1;
int file_count = m_curStartFileNo - m_lastReadFileNo;
vLog(LOG_DEBUG, "总共有%d个目录的%d个文件未读取。\n", dir_count, file_count);
vLog(LOG_DEBUG, "%s 总共有%d个目录的%d个文件未读取。\n", m_pidName.c_str(), dir_count, file_count);
}
/*文件从保存的最后读取的文件目录的文件一直督导当前开始目录*/
vLog(LOG_DEBUG, "最新文件夹编号: %ld, 最新文件名编号: %ld: 最新文件夹中第一个文件的编号: %ld\n", m_currentDirNo, m_currentFileNo, m_currentDirStartFileNo);
vLog(LOG_DEBUG, "%s 最新文件夹编号: %ld, 最新文件名编号: %ld: 最新文件夹中第一个文件的编号: %ld\n", m_pidName.c_str(), m_currentDirNo, m_currentFileNo, m_currentDirStartFileNo);
return TRUE;
}

View File

@ -63,6 +63,7 @@ private:
BOOLEAN publishAnalogData(void);
public:
std::string m_pidName;
BOOLEAN m_bHaveFTP; //存在FTP协议
//ftp参数信息

View File

@ -144,12 +144,13 @@ long AdsDevice::GetLocalPort() const
AdsDeviceState AdsDevice::GetState() const
{
uint16_t state[2];
uint16_t state[2] = {ADSSTATE::ADSSTATE_MAXSTATES, ADSSTATE::ADSSTATE_MAXSTATES};
if(m_Connected == true){
auto error = AdsSyncReadStateReqEx(GetLocalPort(), &m_Addr, &state[0], &state[1]);
if (error) {
LOG_ERROR("AdsDevice can not read device state.");
//throw AdsException(error);
return {static_cast<ADSSTATE>(state[0]), static_cast<ADSSTATE>(state[1])};
}
for (auto i : state) {

View File

@ -53,6 +53,7 @@ struct AdsVariable {
void Read(const size_t size, void* data) const
{
if (!m_Route.IsConnected()) return;
uint32_t bytesRead = 0;
auto error = m_Route.ReadReqEx2(m_IndexGroup,
*m_Handle,
@ -68,6 +69,7 @@ struct AdsVariable {
void Write(const size_t size, const void* data) const
{
if (!m_Route.IsConnected()) return;
auto error = m_Route.WriteReqEx(m_IndexGroup, *m_Handle, size, data);
if (error) {
LOG_ERROR("AdsVariable write failed:" << std::dec << error);